java float乘法不正确的解决办法

举报
再见孙悟空_ 发表于 2022/01/12 23:05:32 2022/01/12
【摘要】 我不知道大家开发中有没有试验过 定义一个float变量然后 做乘法,举个列子 float count = 6;String num = (count*0.7)+"";System.out.println(num); 这个打印出来的结果是4.199999999999999  而不是4.2 《...

我不知道大家开发中有没有试验过 定义一个float变量然后 做乘法,举个列子


  
  1. float count = 6;
  2. String num = (count*0.7)+"";
  3. System.out.println(num);


这个打印出来的结果是4.199999999999999  而不是4.2

《Effective Java》中已经讲出了这种问题,float/double不能停供完全精确的计算结果。这个原理其实很简单,float/int都是32bit(也就是一共有2^32个精确值),而int的范围是-2^31 ~ 2^31-1,而Float的最大值是3.4028235e+38,远大于2^31 - 1。而且,int只负责个数有限的整数,而浮点却要用来表示个数无穷的小数,显然力不从心。浮点精确值可以简单视作一个以0为中心的正态分布,绝对值越小(越接近0的地方),相邻两个精确值月密集。比如,最近的两个值可能只相差0.00000...几十个0...01,而最远的两个精确值,却差了2.028241E31


  
  1. float shoultScore = 6;
  2. String actScore;
  3. float num = (float) (Math.round(shoultScore * 0.7 * 1000)) / 1000;
  4. actScore = num + "";

  
System.out.println(actScore);
 





这次打印出来的结果就是正常的了,调用了一下Math.round这个函数。

具体这个math round  ,ceil ,floor这些 函数分别代表:

floor 返回不大于他的最大整数 
round 则是4舍5入的计算,入的时候是到大于它的整数
round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
ceil 则是不小于他的最小整数

如下:

Math.floor Math.round Math.ceil
1.4 1 1 2
1.5 1 2 2
1.6 1 2 2
-1.4 -2 -1 -1
-1.5 -2 -1 -1
-1.6 -2 -2 -1

如果大家还有其他问题,欢迎加入我的qq群:

开发一群:415275066 开发二群:537532956

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/76021970

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。