Java valueOf()和String.format()之间的差异

Java valueOf()和String.format()之间的差异,java,double,Java,Double,为什么String.valueOf5.6d+5.8d和String.format%f、5.6d+5.8d的值不同 String.valueOf5.6d+5.8d将打印11.39999999999。 字符串。格式%f,5.6d+5.8d将打印11.400000 为什么会这样 编辑:问题不同于,因为String.format汇总请参见格式字符串文档中的答案: 如果精度小于分别由Float.toStringfloat或Double.toStringdouble返回的字符串中小数点后出现的位数,则将使用

为什么String.valueOf5.6d+5.8d和String.format%f、5.6d+5.8d的值不同

String.valueOf5.6d+5.8d将打印11.39999999999。 字符串。格式%f,5.6d+5.8d将打印11.400000

为什么会这样

编辑:问题不同于,因为String.format汇总请参见格式字符串文档中的答案:

如果精度小于分别由Float.toStringfloat或Double.toStringdouble返回的字符串中小数点后出现的位数,则将使用向上舍入算法对该值进行舍入

默认情况下,字符串格式为%f。。。使用6位小数精度;因为这比Double.toString双倍使用时显示的数字要少,相当于String.valueOfdouble,所以该值按上述规定舍入。

来自以下格式字符串的文档:

如果精度小于分别由Float.toStringfloat或Double.toStringdouble返回的字符串中小数点后出现的位数,则将使用向上舍入算法对该值进行舍入


默认情况下,字符串格式为%f。。。使用6位小数精度;因为这比Double.toString双倍(相当于String.valueOfdouble)使用时显示的数字要少,所以该值按上述规定舍入。

解释分为两部分

由于二进制浮点表示、精度和舍入问题,5.6d+5.8d的结果不完全是11.4;请参阅,以了解原因的解释。不,它没有坏

String.valueOf和String.format为同一个双精度值输出不同答案的原因取决于各自的规格:

对于以下各项的价值:

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值

双精度值比14.0更接近11.3999999999999,因此输出为前者

有关格式:

如果转换为“e”、“e”或“f”,则精度为十进制分隔符后的位数。如果未指定精度,则假定精度为6

当您将11.39999999999四舍五入到小数点后的6位精度时,将得到11.40000000


以上引用自Java9Javadocs。

解释分为两部分

由于二进制浮点表示、精度和舍入问题,5.6d+5.8d的结果不完全是11.4;请参阅,以了解原因的解释。不,它没有坏

String.valueOf和String.format为同一个双精度值输出不同答案的原因取决于各自的规格:

对于以下各项的价值:

m或a的小数部分必须打印多少位?必须至少有一个数字来表示小数部分,除此之外,还必须有尽可能多的数字,但只能有尽可能多的数字来唯一区分参数值与double类型的相邻值

双精度值比14.0更接近11.3999999999999,因此输出为前者

有关格式:

如果转换为“e”、“e”或“f”,则精度为十进制分隔符后的位数。如果未指定精度,则假定精度为6

当您将11.39999999999四舍五入到小数点后的6位精度时,将得到11.40000000


以上引文来自Java9Javadocs。

Ah好的。而11.9999999只是一个精度问题,double?@GhostCat我不认为这是一个重复,因为String.format与String.valueOfdouble在这种情况下是不同的,因为取整,我相信这是OP感兴趣的。是的,浮点只是一个有限近似值,没有精度。0.6=3/5和0.8=4/5不能用二进制数字0,1有限表示。啊,好的。而11.9999999只是一个精度问题,double?@GhostCat我不认为这是一个重复,因为String.format与String.valueOfdouble在这种情况下是不同的,因为取整,我相信这是OP感兴趣的。是的,浮点只是一个有限近似值,没有精度。0.6=3/5和0.8=4/5不能用二进制数字0,1有限表示。