est ici une fonction que j'ai écrit pour imprimer tous les chiffres d'un nombre flottant en F #:F # + Net, erreur de calcul en utilisant la fonction System.Math.Floor
let rec TestFloor (fnum:float) =
let floor = System.Math.Floor(fnum)
printfn "fnum:%f floor:%f" fnum floor
if floor > 0.0 then TestFloor((fnum - floor) * 10.0)
Quoi qu'il en soit le résultat est étrange, par exemple :
> TestFloor 1.23;;
fnum:1.230000 floor:1.000000
fnum:2.300000 floor:2.000000
**fnum:3.000000 floor:2.000000**
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:10.000000 floor:9.000000
fnum:9.999998 floor:9.000000
fnum:9.999982 floor:9.000000
fnum:9.999822 floor:9.000000
...
À la quatrième ligne, l'étage 3.0 s'est avéré être 2.0 ce qui est étrange. Les calculs suivants sont tous faux. Je me demande ce qui se passe là-bas?
Merci!
Edit 2
@ sepp2k
Ceci est le résultat après l'utilisation% .30f:
> TestFloor 1.23;;
fnum:1.230000000000000000000000000000 floor:1.000000000000000000000000000000
fnum:2.300000000000000000000000000000 floor:2.000000000000000000000000000000
**fnum:3.000000000000000000000000000000 floor:2.000000000000000000000000000000**
fnum:9.999999999999980000000000000000 floor:9.000000000000000000000000000000
fnum:9.999999999999820000000000000000 floor:9.000000000000000000000000000000
fnum:9.999999999998220000000000000000 floor:9.000000000000000000000000000000
fnum:9.999999999982240000000000000000 floor:9.000000000000000000000000000000
fnum:9.999999999822360000000000000000 floor:9.000000000000000000000000000000
Comme vous pouvez le voir à la quatrième ligne fnum
est 3.00...
et la valeur floor
est 2.00..
Edit 3 - Résolu
Merci à tous, je comprends maintenant ce que le problème est sur le point.
Merci Chris, maintenant je comprends comment et pourquoi! –