java – 为什么Double.parseDouble使9999999999999999到10000000000000000? - 代码日志

java – 为什么Double.parseDouble使9999999999999999到10000000000000000?

参见英文答案 > How to resolve a Java Rounding Double issue                                    13个答案                                为什么Double.parseDouble使9999999999999999到10000000000000000?
例如 :

Double d =Double.parseDouble("9999999999999999");
String b= new DecimalFormat("#.##").format(d);
System.out.println(b);

IS打印

10000000000000000

而是要显示9999999999999999或9999999999999999.00

任何一种帮助是非常感谢。

双倍只有15/16位数的精度,当你给它一个数字,它不能表示(这是大多数时候,甚至0.1不准确)它需要最接近的可表示的数字。

如果要正确表示9999999999999999,则需要使用BigDecimal。

BigDecimal bd = new BigDecimal("9999999999999999");
System.out.println(new DecimalFormat("#.##").format(bd));

版画

9999999999999999

很少有真实世界的问题需要这个准确性,因为你无法准确测量任何东西。即每1万分之1的误差。

您可以找到最大的可表示的整数

// search all the powers of 2 until  (x + 1) - x != 1
for (long l = 1; l > 0; l <<= 1) {
    double d0 = l;
    double d1 = l + 1;
    if (d1 - d0 != 1) {
        System.out.println("Cannot represent " + (l + 1) + " was " + d1);
        break;
    }
}

版画

Cannot represent 9007199254740993 was 9.007199254740992E15

最大的可代表整数是9007199254740992,因为它需要更少的位(作为它的偶数)

http://stackoverflow.com/questions/8907666/why-is-the-double-parsedouble-making-9999999999999999-to-10000000000000000

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – 为什么Double.parseDouble使9999999999999999到10000000000000000?