2017-02-22 68 views
1

Мне нужно извлечь десятичное число. Я нашел this ответ, используя %%.r: Почему %% для извлечения десятичных чисел не создает логических значений?

Способ очень прост:

0.1%%1 
[1] 0.1 

Если я пытаюсь 10.1:

10.1%%1 
[1] 0.1 

Но когда я оцениваю равенство не работает

0.1%%1==10.1%%1 
[1] FALSE 

Почему это ЛОЖЬ? Большое спасибо

ответ

1

Это связано с тем, что двоичная плавающая точка не очень хорошо преобразуется в десятичное представление. Предполагая, что 64 бит IEEE754 плавающей точкой:

Ближайший число с плавающей точкой 0.1 является 0,1000000000000000055511151231257827021181583404541015625

Ближайший число с плавающей точкой до 10,1 является 10,0999999999999996447286321199499070644378662109375

Вы можете увидеть, что десятичные части существенно различаются, поэтому точное сравнение неизбежно завершится неудачей.

Трудно предложить средство правовой защиты здесь, поскольку оно очень зависит от вашего конкретного случая использования. (Инстинкт подсказывает мне, что вы можете сравнить с аддитивной толерантностью 1е-13).

+0

В качестве дополнения к этому вы можете округлить до 1 десятичного знака, чтобы избежать этого неравенства. «0.1 %% 1 == round (10.1 %% 1, 1)» TRUE. –

+2

'all.equal' также покажет их как равные. –