У меня есть серия вычислений с использованием удвоений в Java, которая всегда должна составлять до 1.0. Иногда в Java сумма немногочисленная. Я выполняю вычисления в Excel, и они составляют до 1,0. Я подозреваю, что это связано с некоторыми двойными ошибками округления. Меня озадачило то, что он работает в Excel. Любая идея, что я могу сделать, чтобы исправить это?Java double loss precision
У меня есть следующий код в Java:
double d1 = 0.979;
double d2 = 3;
double d3 = 21;
double d4 = d1 * d2/d3;
System.out.println("d4 " + d4);
Это печатает 0.13985714285714285. В Excel, если я делаю тот же расчет (=C14*D14/E14)
, где C14 - d1, D14 - d2, а E14 - d3, я получаю 0.1398571428571430000. Правильно ли это Excel, потому что он округляется?
Спасибо.
Арифметика с плавающей запятой имеет свои ограничения, и я подозреваю, что этот вопрос задан раньше на SO. Вы можете попробовать использовать «BigDecimal», если вам действительно нужна такая точность. –
'double' в Java по своей сути является неточным. Используйте «BigDecimal» всякий раз, когда требуется точность. –
Оба Java и Excel округляют для этого - математически правильный результат - бесконечное повторяющееся десятичное число. – Douglas