2015-08-25 4 views
3

Я делаю модульное тестирование, и я получил эту строку:Почему эти разные номера одинаковы?

assertEquals(1.1886027926838422606868849265505866347, 1.18860279268384230000000000000000000000,0); 

С дельтой 0 они должны быть точно такими же, чтобы пройти, и они явно не так, однако этот тест проходит , попробуй сам.

Изменение дельта до 1E-50 все еще проходит.

Почему это происходит, когда у них два разных номера?

+0

Возможно, потому что Java не поддерживает числа, большие. –

+0

@luoluo, как это похоже на этот вопрос? – Aequitas

ответ

0

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

10

Это связано с тем, что Java-компилятор округляет эти два числовых литерала до одного и того же числа.

Выполнить этот эксперимент:

System.out.println(1.1886027926838422606868849265505866347); 
System.out.println(1.18860279268384230000000000000000000000); 

Это печатает такое же количество (demo):

1.1886027926838423 
1.1886027926838423 

double примитивного типа может обрабатывать только до 16 знаков после запятой, поэтому он не может представлять эти цифры вплоть до последней цифры.

Если вам нужна полная точность, вместо этого используйте BigDecimal.

+0

Вы говорите 16 знаков после запятой, поэтому, если я умножу все на 10^16, могу ли я иметь еще 16 знаков после запятой? – Aequitas

+0

@Aequitas No. (примерно) 16 знаков после запятой - это ограничение языка. Номер должен быть округлен. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html –

+1

@Aequitas Не совсем: количество правильных цифр, которые вы получите, останется неизменным, но оно будет перераспределено между целым и дробная часть ([demo] (http://ideone.com/xMpHdp)). – dasblinkenlight

Смежные вопросы