valueOf() 和 String.format() 的区别

为什么值String.valueOf(5.6d + 5.8d)String.format("%f", 5.6d + 5.8d)不同势?

String.valueOf(5.6d + 5.8d)将打印“11.399999999999999”。
String.format("%f", 5.6d + 5.8d)将打印“11.400000”。

为什么会这样?


摇曳的蔷薇
浏览 357回答 2
2回答

皈依舞

从文档格式字符串的字符串#格式:如果精度小于分别由 Float.toString(float) 或 Double.toString(double) 返回的字符串中小数点后出现的位数,则该值将使用四舍五入算法进行四舍五入。默认情况下,String.format("%f", ...)使用6精度的十进制数字;因为这比使用时出现的位数少Double.toString(double)(相当于String.valueOf(double)),因此该值将按上述规定四舍五入。

哔哔one

解释有两个部分。的结果5.6d + 5.8d并不完全是11.4由于二进制浮点表示、精度和舍入问题;请参阅浮点数学是否已损坏?解释为什么会这样。(不,它没有坏!)String.valueOf和String.format输出相同double值的不同答案的原因归结为各自的规范:对于valueOf:“必须为 m 或 a 的小数部分打印多少位数字?必须至少有一位数字来表示小数部分,并且超过这个数字,但只能是唯一区分参数所需的更多数字来自 double 类型的相邻值的值。”该double值接近11.399999999999999比14.0这样的输出是前者。对于format:“如果转换为'e'、'E'或'f',则精度为小数点分隔符后的位数。如果未指定精度,则假定为6。”当您四舍五入11.399999999999999到小数点后的 6 位精度时,您会得到11.40000000.(以上引用来自 Java 9 javadocs。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java