Как бороться с недостатком в Java? - PullRequest
1 голос
/ 23 октября 2019

Вот проблема

double a = 1.0665901062490447E-18;
double b = 1.0;
double c = a+b; // this is 1.0

Мне нужно это суммированное значение. Что мне с этим делать?

Ответы [ 2 ]

6 голосов
/ 23 октября 2019

Как я уже упоминал в моем комментарии , 1.0665901062490447E-18 является очень небольшим значением. Если вам нужна такая большая точность, вы должны использовать BigDecimal. Что-то вроде

double a = 1.0665901062490447E-18, b = 1.0;
System.out.println(BigDecimal.valueOf(a).add(BigDecimal.valueOf(b)).toPlainString());

Какие выходные данные

1.0000000000000000010665901062490447

Обратите внимание, что существует предопределенная константа BigDecimal.ONE - поэтому вышеприведенное также можно записать

System.out.println(BigDecimal.valueOf(a).add(BigDecimal.ONE).toPlainString());
0 голосов
/ 23 октября 2019

Существуют ограничения на то, что могут делать примитивные типы практически на любом языке. В этом случае тип double, на мой взгляд, связан IEEE-754 . Для решения этого класса задач Библиотеки произвольной точности были созданы для многих языков.

Классический "Что должен знать каждый специалист по вычислительной технике об арифметике с плавающей точкой" требуется чтение для всех типов данных с плавающей запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...