penso che si dovrebbe fare solo quello che lei ha suggerito - utilizzare la posizione del punto decimale. Ovvio svantaggio potrebbe essere che devi pensare a internatialisation te stesso.
var decimalSeparator = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator;
var position = input.IndexOf(decimalSeparator);
var precision = (position == -1) ? 0 : input.Length - position - 1;
// This may be quite unprecise.
var result = Math.Pow(0.1, precision);
C'è un'altra cosa che si potrebbe provare - i Decimal
tipo memorizza un valore precission interna. Pertanto è possibile utilizzare Deciml.TryParse()
e ispezionare il valore restituito. Forse l'algoritmo di parsing mantiene la precessione dell'input.
Infine vorrei suggerire di non provare qualcosa utilizzando numeri in virgola mobile. Basta analizzare l'input per rimuovere qualsiasi informazione sugli zero finali. Quindi devi aggiungere una cifra artificiale diversa da zero per conservarli o fare trucchi simili. Potresti imbatterti in problemi di precisioni. Infine, trovare la precisione basata su un numero in virgola mobile non è semplice. Vedo qualche brutta matematica o un ciclo moltiplicato con dieci ogni iterazione fino a quando non c'è più alcuna parte frazionaria. E il ciclo è dotato di nuove emissioni precission ...
UPDATE
Analisi in una fabbrica deciaml. Se Decimal.GetBits()
per i dettagli.
var input = "123.4560";
var number = Decimal.Parse(input);
// Will be 4.
var precision = (Decimal.GetBits(number)[3] >> 16) & 0x000000FF;
Da qui utilizzando Math.Pow(0.1, precision)
è semplice.
fonte
2010-07-19 14:25:42
Sei sicuro che 4500 sarebbe un 1 e non un 100? – corsiKa
Qual è il risultato previsto nel caso 0.0 e 0.1? – user1785960
Per me è una domanda confusa. Non chiedi precisione decimale. Chiedi: come ottenere il numero di cifre in una parte della frazione. La definizione di 'decimal precision' è qui per Me: https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#i16209 – user1785960