为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2021-05-30 17:23:31
为什么值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”。为什么会这样?
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

从文档格式字符串字符串#格式

如果精度小于分别由 Float.toString(float) 或 Double.toString(double) 返回的字符串中小数点后出现的位数,则该值将使用四舍五入算法进行四舍五入。

默认情况下,String.format("%f", ...)使用6精度的十进制数字;因为这比使用时出现的位数少Double.toString(double)(相当于String.valueOf(double)),因此该值将按上述规定四舍五入。


查看完整回答
反对 回复 2021-06-02
?
哔哔one

TA贡献1854条经验 获得超8个赞

解释有两个部分。

  1. 的结果5.6d + 5.8d并不完全是11.4由于二进制浮点表示、精度和舍入问题;请参阅浮点数学是否已损坏?解释为什么会这样。(不,它没有坏!)

  2. String.valueOfString.format输出相同double值的不同答案的原因归结为各自的规范:

    对于valueOf

    “必须为 m 或 a 的小数部分打印多少位数字?必须至少有一位数字来表示小数部分,并且超过这个数字,但只能是唯一区分参数所需的更多数字来自 double 类型的相邻值的值。”

    double值接近11.39999999999999914.0这样的输出是前者。

    对于format

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

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

(以上引用来自 Java 9 javadocs。)


查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 356 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信