R "точное" представление с плавающей точкой - PullRequest
1 голос
/ 25 сентября 2019

Как R решает преобразовать 0.099999999999999 в 0.1?

> format(0.3/3, digits=17)
[1] "0.099999999999999992"
> format(0.3/3, digits=16)
[1] "0.09999999999999999"
> format(0.3/3, digits=15)
[1] "0.1"

1 Ответ

1 голос
/ 25 сентября 2019

Полное десятичное разложение 0,03 / 3 в 64-разрядной арифметике IEEE 754:

0,09999999999999999167332731531132594682276248931884765625

Если наиболее значимая выпадающая цифра - это первые 6, округляется, давая:

0.099999999999999992

Если самая значимая пропущенная цифра - это первая 1, она округляется, давая:

0.09999999999999999

Если самой значимой выпадающей цифрой являетсяпоследние 9 из блока девяток, он округляется, давая:

0.1

Все ваши результаты, включая итоговые 0.1, можно объяснить, приняв десятичное округление до указанного числа цифр..

...