有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在双精度数据类型的情况下,某些语言的java小数点精度会丢失

我很惊讶看到下面的程序,请告诉我它是如何运行的,因为我非常同意小数点后的精度,下面是程序

double fixedRate = 0.997500000000;  //**output --->0.9975
    //  BigDecimal fixedRate = new BigDecimal("0.997500000000");        
        double fixedRate1 = 0.1234567890123456789;  

        System.out.println(fixedRate);
        System.out.println(fixedRate1);

输出是

0.9975
0.12345678901234568

现在,请告知第一个输出是0.9975,但下一个的输出不是小数点后的截断,但为什么是第一个


共 (2) 个答案

  1. # 1 楼答案

    精度没有损失。它只是不打印,因为不需要更多的数字来区分打印值和任何其他双精度值

    如果您确实想强制使用一定数量的小数位数,请查看系统。出来printf()字符串。format()

    有关更多详细信息和可能的格式,请参见https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html

    结果可能是这样的:

                System.out.printf("%.19f%n",fixedRate);
                System.out.printf("%.19f%n", fixedRate1);
    
  2. # 2 楼答案

    根据你的问题

    for the first the ouput is 0.9975 but late on for next it is not truncating after decimal points but why for first then

    因为double是数字数据类型,因此不能包含前导零和尾随零

    一个double不关心格式化——它只关心存储。打印时,它会转换为字符串(使用Double的静态^{}方法)

    简单来说,值0.99750.997500000000没有区别,或者与0.997500000000相同,因为数字后面的零没有任何值

    但是如果你有这样的值^ {CD8>},那么所有的数字都会被打印出来。检查一下here

    如果你想格式化这个值,你可以看到这个问题:How to properly display a price up to two decimals (cents) including trailing zeros in Java?