У меня есть строка, которая отформатирована правильно, чтобы быть отлитой до двойника, и она отлично работает для большинства десятичных знаков. Проблема в том, что для .33, .67 и, возможно, других, которые я не тестировал, десятичное значение становится чем-то вроде .6700000000002
, или .329999999998
. Я понимаю, почему это происходит, но у кого-то есть предложение исправить это.Неправильное десятичное преобразование из двоичного в строку в java
ответ
Это результат правил округления IEEE-754, некоторые цифры не могут быть представлены точно в two's complement. Например, 1/10
не является точно представимым.
Вы можете добавить больше точности (но не бесконечно), используя BigDecimal.
BigDecimal oneTenth = new BigDecimal("1").divide(new BigDecimal("10"));
System.out.println(oneTenth);
Какие выходы 0.1
Некоторые десятичные числа не могут быть точно представлены с внутренним представлением машины базы 2.
ах, который имел бы смысл. Значит, это связано с стандартом IEEE с плавающей запятой, который я предполагаю? Любая идея, как ее исправить – KBusc
@KBusc, я считаю, что стандарт IEEE-754 фактически позволяет десятичное представление с плавающей запятой (полезно для учета и финансов). Таким образом, это действительно связано с тем, что ваша цель использует представление базы 2 (как и большинство целей). – user3146587
Это двойная точность для вас. Двоичные числа и десятичные знаки не работают хорошо. Если вы не делаете что-то действительно точное, это должно быть хорошо, если вы его печатаете, вы должны использовать либо десятичный формат, либо printf.
Значение чисел с плавающей запятой не сохраняется непосредственно, а с экспоненциальными значениями. Вы можете написать 3.1233453456356 как номер, но в памяти хранится что-то вроде 3 и 2^6. Он пытается сохранить значение как можно ближе к вашему номеру, но эти различия могут произойти.
Это не должно быть проблемой, если вы не испытывать равенства. С плавающей точкой тестами для равенства вам нужно разрешить «дельту», так что:
if (a == b)
становится
if (abs(a-b) < 0.000001)
или аналогичное малое значение дельты. Для печати ограничьте ее до двух знаков после запятой, а форматтер будет вокруг вас.
- 1. Преобразование из двоичного в десятичное
- 2. Преобразование двоичного в десятичное в Java
- 3. C++ Простое преобразование из двоичного в десятичное
- 4. Преобразование из двоичного дополнения в десятичное.
- 5. Python-Преобразование двоичного в десятичное
- 6. Преобразование двоичного в десятичное в Objective C
- 7. Преобразование двоичного в десятичное с использованием массивов в java
- 8. Преобразование 32 бит двоичного числа в десятичное
- 9. Преобразование двоичного в десятичное с помощью MySQL
- 10. преобразование двоичного в десятичное - результаты слишком большие
- 11. Java: Преобразование двоичного кода в строку
- 12. Преобразование из двоичного в строку в C++
- 13. Преобразование двоичного числа в десятичное число из файла с пробелом
- 14. Преобразование числа с плавающей точкой из двоичного в десятичное число
- 15. Преобразование из двоичного в десятичное без использования арифметических операций
- 16. Преобразование из двоичного в десятичный в Java
- 17. Java - преобразование булева [] в десятичное
- 18. десятичное двоичное преобразование java
- 19. Преобразование повторяющегося двоичного числа в десятичное (выражение в виде серии?)
- 20. Преобразование двоичного в десятичное число в заданной последовательности
- 21. Преобразование пользовательского ввода из двоичного в десятичное с использованием модуля оператора в Java
- 22. высчитывает двоичного в десятичное вручную
- 23. Преобразование шестнадцатеричного в десятичное и десятичное на TimeStamp в JAVA
- 24. Преобразование двоичного в десятичное с использованием рекурсивного метода
- 25. java 4 десятичное место для двоичного кода
- 26. Преобразование шестнадцатеричного в десятичное в Java
- 27. Неправильное преобразование int в строку в C++
- 28. Преобразование двоичного в десятичное с использованием цикла while?
- 29. Преобразование двоичного в десятичное с использованием массива и цикла
- 30. Преобразование сложения двоичного кода 2 в десятичное число
Добро пожаловать в мир чисел с плавающей запятой :) –