Java 获取存储的实际数字

Java 获取存储的实际数字,java,floating-point,bigdecimal,ieee-754,Java,Floating Point,Bigdecimal,Ieee 754,我有一个项目,用泰勒级数创建一个科学计算器。此外,我正在分析ieee 754标准浮点系统的一个数字 在我的计算器中,用户选择是要单精度还是双精度:我使用浮点和双变量, 然后我分析了ieee 754规范中的数字 如果用户需要双精度,分析如下: double analyze=3.45 BigDecimal bd=new BigDecimal(analyze) 这让我 3.45000000000000017763568394002504646778106689453125 这个数字是以二进制格式

我有一个项目,用泰勒级数创建一个科学计算器。此外,我正在分析ieee 754标准浮点系统的一个数字

在我的计算器中,用户选择是要单精度还是双精度:我使用浮点和双变量, 然后我分析了ieee 754规范中的数字

如果用户需要双精度,分析如下:

double analyze=3.45
BigDecimal bd=new BigDecimal(analyze) 
这让我

3.45000000000000017763568394002504646778106689453125
  • 这个数字是以二进制格式存储在pc内存中的实际数字吗

  • 如果不是,我能得到存储的数字的真实值吗

  • 为什么会发生这种情况

    双重分析=0.5

    BigDecimal db=新的BigBecimal(分析)

  • 它只打印
    0.5
    -为什么会丢失有效数字

    有人能告诉我为什么会这样吗

            BigDecimal one=new BigDecimal(0.1);
            BigDecimal five=one.multiply(new BigDecimal(5)) ;
            System.out.println("5 times 0.1 is "+" "+ five);
    
            System.out.println("But the 0.5 in BigDecimal is " + " "+ new BigDecimal(0.5));
    
    通过运行这个,您可以 5乘以0.1等于0.5000000000000000277555756156289135907917022705078125 但是BigDecimal中的0.5是0.5

    1.我想问你这个数字是不是以二进制格式存储在pc内存中的实际数字

    2.如果不是,我可以得到存储的数字的真实值

    是的,所以没问题

  • 它只打印-->0.5为什么会丢失显式数字
  • 你没有
    0.5
    是以二进制格式存储的精确数字

    1.我想问你这个数字是不是以二进制格式存储在pc内存中的实际数字

    2.如果不是,我可以得到存储的数字的真实值

    是的,所以没问题

  • 它只打印-->0.5为什么会丢失显式数字

  • 你没有
    0.5
    是以二进制格式存储的精确数字。

    一般来说,float和double将准确地表示十进制数字(除了二的幂和一些其他“最佳点”)。该数字以二进制形式存储在内部。您可以使用
    Double.doubleToRawLongBits
    Float.floatorawintbits
    访问内部表示法。通常,Float和Double将准确地表示十进制数(除了二的幂和一些其他“最佳点”)。该数字以二进制形式存储在内部。您可以使用
    Double.doubleToRawLongBits
    Float.floatorawintbits
    访问内部表示

  • 是,3.4500000000000017763568394002504646778106689453125是将数字“3.45”转换为常用双精度格式时存储在双精度格式中的实际值

  • 这才是真正的价值所在

  • 您没有显示打印0.5的方法。我记得,Java中的一种常见显示机制只是在可能的情况下打印尽可能多的数字来准确表示值。它不打印尾随零,因为它们是冗余的

  • 您可能会想,“如果只打印.5,我怎么知道数字是.5000000000而不是.5000000001或类似的数字?”答案是,如果数字不同于.5,则会打印更多的数字,因为显示机制被定义为这样做。所以你可以相信“.5”的意思是。5,不多也不少

    如果这是一个学校项目,那么您可能不需要担心3.45会用一个稍微不同的值表示。继续,使用双精度中的值进行计算

    此外,泰勒级数对于真正的计算器来说是一个糟糕的选择,因为它们被设计成在一个点附近精确,但是你会想要一个在一个区间内精确的级数。还有其他一些系列可以更好地分散错误,因此它们需要更少的术语才能得到准确的结果。我只会使用泰勒级数,如果它被建议作为学校项目的一部分

  • 是,3.4500000000000017763568394002504646778106689453125是将数字“3.45”转换为常用双精度格式时存储在双精度格式中的实际值

  • 这才是真正的价值所在

  • 您没有显示打印0.5的方法。我记得,Java中的一种常见显示机制只是在可能的情况下打印尽可能多的数字来准确表示值。它不打印尾随零,因为它们是冗余的

  • 您可能会想,“如果只打印.5,我怎么知道数字是.5000000000而不是.5000000001或类似的数字?”答案是,如果数字不同于.5,则会打印更多的数字,因为显示机制被定义为这样做。所以你可以相信“.5”的意思是。5,不多也不少

    如果这是一个学校项目,那么您可能不需要担心3.45会用一个稍微不同的值表示。继续,使用双精度中的值进行计算

    此外,泰勒级数对于真正的计算器来说是一个糟糕的选择,因为它们被设计成在一个点附近精确,但是你会想要一个在一个区间内精确的级数。还有其他一些系列可以更好地分散错误,因此它们需要更少的术语才能得到准确的结果。我只会使用泰勒级数,如果它被建议作为学校项目的一部分

  • 对。构造函数“将double转换为BigDecimal,BigDecimal是double的二进制浮点值的精确十进制表示形式。”BigDecimal方法显示精确值

  • 不适用

  • 0.5完全可以表示为双精度。BigDecimal(0.5)结果的未标度值为5,标度为1。它满足无指数显示的BigDecimal条件。小数点后的位数等于刻度1。

    BigDecimal one=new BigDecimal(0.1); BigDecimal five=one.multiply(new BigDecimal(5)) ;