У меня есть примитивный поплавок и мне нужен как примитив-двойник. Простое преобразование float в double дает мне странную дополнительную точность. Например:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Однако, если вместо приведения я выведу число с плавающей запятой как строку и проанализирую строку как двойную, я получу то, что хочу:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Есть ли лучший способ, чем перейти к String и обратно?
источник
Я нашел следующее решение:
Если вы используете float и double вместо Float и Double, используйте следующее:
источник
Используйте
BigDecimal
вместоfloat
/double
. Есть много чисел, которые нельзя представить как двоичные числа с плавающей запятой (например,0.1
). Таким образом, вы должны либо всегда округлять результат до известной точности, либо использоватьBigDecimal
.См. Http://en.wikipedia.org/wiki/Floating_point для получения дополнительной информации.
источник
BigDecimal
так как это позволит отловить большинство распространенных ошибок. Если дела идут слишком медленно, им нужно узнать больше и найти способы оптимизировать свои проблемы. Преждевременная оптимизация - корень всех зол, - Д.Е. Кнут.Поплавки по своей природе неточны и всегда имеют аккуратные "проблемы" округления. Если точность важна, вы можете подумать о рефакторинге своего приложения для использования Decimal или BigDecimal.
Да, числа с плавающей запятой в вычислительном отношении быстрее, чем десятичные дроби, благодаря поддержке процессора. Однако вы хотите быстро или точно?
источник
Информацию можно найти в разделе 48 - Избегайте float и double, когда требуются точные значения, Эффективной Java 2-го издания Джошуа Блоха. В этой книге много хороших материалов, и ее определенно стоит посмотреть.
источник
Это работает?
источник
Простое решение, которое хорошо работает, - это проанализировать двойное значение из строкового представления числа с плавающей запятой:
Не очень эффективно, но работает!
источник