Domanda

Qualcuno può spiegare perché int (0.4 * 10.0) è 4 ma int ((2.4 - 2.0) * 10.0) è < code> 3 ?

E poi spiega anche come ottenere 4 . cioè devo davvero fare int (System.Math.Round ((2.4 - 2.0) * 10.0)) ?

È così brutto per qualcosa che dovrebbe essere così semplice.

È stato utile?

Soluzione

La doppia rappresentazione di 2.4 - 2.0 è 0.399999999999. Quando converti un numero in int, la parte decimale viene troncata, quindi 3.999999999 viene troncata a 3.

Altri suggerimenti

  

E poi, per favore, spiega come ottenerne 4. cioè devo davvero fare

     

int (System.Math.Round ((2.4 - 2.0) * 10.0))

     

è così brutto per qualcosa che dovrebbe essere così semplice.

Certo che no, basta definire

let round x = int System.Math.Round(x)

In realtà, in .Net esiste un tipo di dati decimale che ti aiuterà a risolvere questo problema, se i tuoi numeri possono essere rappresentati esattamente come frazioni decimali.

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4

Per convertire un numero float in un int usare:

let i = Convert.ToInt32 (f)

I numeri in virgola mobile non sono una precisione infinita. Alcuni numeri possono essere rappresentati perfettamente (tutto ciò che comporta potenze di due, ad esempio 1, 1/2 = 0,5, 1/4 = 0,25, ecc.), E altri non possono (ad esempio 1/3 non possono essere esattamente decomposti in una sequenza finita di poteri di due). Spesso, tagliare la fine della serie infinita fa sì che la versione codificata di un numero sia leggermente più piccola del suo valore reale.

Combina questo con il fatto che l'operatore (int) tronca piuttosto che arrotondare, e puoi imbatterti in casi in cui un'operazione che dovrebbe produrre 4.0 risulta invece in 3.999999999991, che diventa 3.

Ogni volta che stai provando a convertire float / double in ints, devi pensare attentamente a quale operatore vuoi usare: troncare (arrotondare per difetto), arrotondare per eccesso o arrotondare al più vicino.

Poiché si tratta di un problema con le rappresentazioni in virgola mobile, ciò è vero non solo in F #, ma C # e (IIRC) Java e altri linguaggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top