这是我正在查看的内容:
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
所以我理解“p”的十进制值1.15无法在二进制中精确表示。
因此,大的big decimal“bdp”输出对我来说是完全有意义的...那就是浮点数的实际值。
问题1
当将浮点数“p”转换回字符串进行输出(如1.15),舍入是在哪里/如何发生的(从内部值1.149..375到1.15)?
它在文档中的哪里规定?toString javadoc并没有真正帮助我。
我在the language spec中看到了这个:
浮点类型和双精度类型的元素是可以使用IEEE 754 32位单精度和64位双精度二进制浮点格式表示的值。 Wikipedia的IEEE 754文章提供了以下内容:
这可以提供6到9个有效十进制数字的精度(如果将最多具有6个有效十进制数字的十进制字符串转换为IEEE 754单精度,然后将其转换回相同数量的有效十进制数字,则最终字符串应与原始字符串匹配;
问题2
所以看起来这就是Java / IEEE 754浮点数应该工作的方式?
我得到了一定数量的float / string转换/表示的准确性(例如“p”和“q”),如果超过了该数字,Java将对显示进行一些舍入(例如“r”)?
感谢您的帮助。
System.out.println(new BigDecimal(someFloat));
来获取someFloat
的精确十进制表示。 - Patricia Shanahan