关于浮点表示,已经向SO发布了几个问题.例如,十进制数0.1没有精确的二进制表示,因此使用==运算符将其与另一个浮点数进行比较是危险的.我理解浮点表示的原理.
我不明白的是,从数学的角度来看,为什么小数点右边的数字比左边的数字更"特殊"?
例如,数字61.0具有精确的二进制表示,因为任何数字的整数部分始终是精确的.但数字6.10并不准确.我所做的只是将十进制移动到一个地方,然后我突然从Exactopia转到了Inexactville.在数学上,两个数字之间应该没有内在差异 - 它们只是数字.
相比之下,如果我将小数位移到另一个方向以产生数字610,我仍然在Exactopia中.我可以继续向那个方向前进(6100,610000000,610000000000000),它们仍然是精确,准确,准确的.但是一旦小数越过某个阈值,数字就不再精确了.
这是怎么回事?
编辑:为了澄清,我想远离关于行业标准表示的讨论,例如IEEE,并坚持我认为是数学上"纯粹"的方式.在基数10中,位置值为:
... 1000 100 10 1 1/10 1/100 ...
Run Code Online (Sandbox Code Playgroud)
在二进制文件中,它们将是:
... 8 4 2 1 1/2 1/4 1/8 ...
Run Code Online (Sandbox Code Playgroud)
对这些数字也没有任何限制.位置无限增加到左侧和右侧.
在Java中,我试图将一串格式解析"###.##"为float.该字符串应始终具有2个小数位.
即使字符串中有值123.00,浮子也应该是123.00,不123.0.
这是我到目前为止:
System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);
Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));
System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);
Run Code Online (Sandbox Code Playgroud)
它打印:
string liters of petrol putting in preferences is 010.00
liters of petrol before putting in editor: 10.0
Run Code Online (Sandbox Code Playgroud) 这就是我在看的内容:
float p=1.15f;
BigDecimal bdp=new BigDecimal(p);
float q=1.1499999f;
float r=1.14999999f;
System.out.println(p); //1.15
System.out.println(bdp); //1.14999997615814208984375
System.out.println(q); //1.1499999
System.out.println(r); //1.15
Run Code Online (Sandbox Code Playgroud)
所以我理解"p"1.15的十进制值不能用二进制表示.
因此,大的十进制"bdp"输出对我来说非常有意义......这就是浮点数的实际值.
问题1
当浮点数"p"转换回字符串输出(如1.15)时,舍入的方式/位置(从内部1.149..375到1.15)?
它在文档中指定了哪里?toString javadoc并没有真正的帮助(至少我).
我确实在语言规范中看到了这一点:
float和double类型的元素是可以分别使用IEEE 754 32位单精度和64位双精度二进制浮点格式表示的值.
维基百科的IEEE 754文章给出了这样的结论:
这给出了6到9个有效十进制数字精度(如果一个十进制字符串最多有6个有效小数被转换为IEEE 754单精度,然后转换回相同数量的有效小数,则最终字符串应与原始字符串匹配;
问题2
因此,似乎Java/IEEE 754浮点数应该如何工作?
我保证浮点/字符串转换/表示的准确性达到一定数量的数字(如"p"和"q"),如果超过该位数,Java将进行一些舍入显示(如"r") ")?
感谢帮助.