О, чувак, интересно.Вы хотите точно узнать, как double
делает это неточно.
Я думаю, new BigDecimal(double).toString()
выдаст вам все неправильные цифры, поскольку BigDecimal
представляет число с точно заданным значением.точность.
РЕДАКТИРОВАТЬ: Ohhhhhhhh, я думаю, что я вижу, что происходит.
Позвольте мне попытаться объяснить это так: Double.toString
возвращает наименее точный String
такой, что Double.parseDouble
вернет точно такое же double
- , что будет достаточно цифр, чтобы «однозначно идентифицировать» точное значение IEEE 754, хотя фактическое значение может иметь больше цифр, чем напечатано.То, что Double.toString
не дает вам столько цифр, сколько вы ожидаете, не означает, что значение фактического IEEE 754 с двойной точностью округляется до такого количества цифр.new BigDecimal(double).toString
вернет точное сохраненное значение IEEE-754.
ОБНОВЛЕНИЕ:
Что происходит, когда он печатает 27.86753
, это на самом деле больше точное значение, чем цифры, которые вы указали в качестве правильного ответа, 27.867530822753906
.Это потому, что toString
предназначен для распечатки столько, сколько необходимо, чтобы Double.parseDouble(Double.toString(value))
не использовался.
Я запустил следующий код:
public static void main(String[] args) {
double dWithFloat = Double.parseDouble(Double.toString(Float.parseFloat("27.86753")));
double dJustParsed = Double.parseDouble("27.86753");
System.out.println(dWithFloat);
System.out.println(dJustParsed);
BigDecimal bigFromFloat = new BigDecimal(dWithFloat);
BigDecimal bigJustParsed = new BigDecimal(dJustParsed);
System.out.println(bigFromFloat);
// prints the exact value from the double,
// doesn't round or truncate like Double.toString
System.out.println(bigJustParsed);
}
и распечатано
27.867530822753906 // Double.toString(Double.parseDouble(Double.toString(Float.parseFloat("27.86753"))));
27.86753 // Double.toString(Double.parseDouble("27.86753")) is indeed a no-op
27.86753082275390625 // This is the _actual_ value from D.parseD(D.toString(F.parseF("27.86753")))
27.867529999999998580051396857015788555145263671875 // This is the actual value from D.parseD("27.86753")
И действительно, это второе значение заметно ближе к 27,86753, с запасом примерно в 0,0000008.