вот функция, которую я написал для печати каждой цифры числа с плавающей точкой в F #:
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)
В любом случае результат странный, например:
> 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
...
На четвертой строке пол 3.0 оказался 2.0, что странно. Следующие вычисления все идут не так. Мне интересно, что там происходит?
Спасибо!
Редактировать 2
@ sepp2k
Это результат после использования% .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
Как видно из четвертой строки, fnum
равно 3.00...
, а значение floor
равно 2.00..
Редактировать 3 - Решено
Спасибо всем, теперь я понимаю, в чем проблема.