java浮点数无法精确存储为和能精确输出

GOD__ 发布于 2017/09/15 16:34
阅读 656
收藏 0

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

 


    public void test() {
        double a = 0.7;
        System.out.println(a);
    }

0.7在计算机中应该是无法精确存储的,那为什么可以输出0.7?

 

加载中
0
DeMoNHaDeS
DeMoNHaDeS

无法精确存储这个描述不太合适,java中double的存储遵循IEEE 754标准。

double可能会有不精确的情况

public class Test {

    public static void main(String[] args) {
        System.out.println(0.1 * 1);
        System.out.println(0.1 * 2);
        System.out.println(0.1 * 3);
        System.out.println(0.1 * 4);
        System.out.println(0.1 * 5);
        System.out.println(0.1 * 6);
        System.out.println(0.1 * 7);
        System.out.println(0.1 * 8);
        System.out.println(0.1 * 9);
    }
}

结果:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6000000000000001
0.7000000000000001
0.8
0.9

会出现,不等于每次都会发生

GOD__
GOD__
是否精确肯定是固定的,不是随机的。我想知道精确度不准确出现的原因是什么,不出现的原因又是什么。
DeMoNHaDeS
DeMoNHaDeS
回复 @GOD__ : 可能会出现,不等于每次都会发生
GOD__
GOD__
是我描述不准确,请看关键问题,0.7肯定无法精确存储,但是可以准确输出
0
kakai
kakai

可以看看IEEE 754标准的介绍,不仅仅是java,很多语言的浮点数都遵循这个标准,不然很多前后端的计算将会出现严重的偏差了。

0
tcxu
tcxu

以下情况,也许可以说服你

  • 在 Java 中写入 new BigDecimal(0.7) 所创建的 BigDecimal ,它不会正好等于 0.7。这是因为 0.7 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。参看 java api new BigDecimal(double) 文档
  • 只有以字符串的形式: “0.7“ 为参数, 传入 到构造方法的值才是 正确的。
    import java.math.BigDecimal;
    public class TestDouble {
    	
    	public static void main(String args[]) {
            double a = 0.7;
            System.out.println(new BigDecimal(a));
            System.out.println(new BigDecimal("0.7"));
        }
    }

    输出:

0.6999999999999999555910790149937383830547332763671875
0.7

tcxu
tcxu
回复 @GOD__ : System.out.println( double ) 输出变量,是以 double的精度为15~16位 为限,即最多输出16位 有效数字,超出这个(位数)范围的 “信息“,不会输出。0.7 显然在有效数字范围之内, 定会准确打印出。
GOD__
GOD__
我就是因为new BigDecimal(0.7)坑过来的,为什么new BigDecimal(0.7)不准确,而System.out.prinln(0.7)可以精确输出
0
tcxu
tcxu

为何 System.out.prinln(0.7)可以精确输出?

以下代码,显示:System.out.print(double) 输出 最多 16 位有效数字。0.7 只有一位有效数字,所以,可以精确输出。

import java.math.BigDecimal;
public class Testprintln {
	public static void main(String args[]) {
	double a = 0.7000000000000005666;
    double b = 0.00007000000000000005666;
    System.out.println(a);
    System.out.println(b);
    }
}

输出:

0.7000000000000006
7.000000000000006E-5

tcxu
tcxu
回复 @GOD__ : 输出是16位有效数字: 0.7000000000000001, 其结果显示出不精确。
GOD__
GOD__
System.out.println(0.1 * 7);照你这么说这个输出什么
0
isjack
isjack

 

dwfdewwe fwedewdew
fwefewewwe fwefewew
weew dwedewwe

 wefewfewfwe

cfwerfwefrefrwefre

 

0
l
lzg14

我的回答:

https://my.oschina.net/jasonli0102/blog/3013198

返回顶部
顶部