前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java float乘法不正确的解决办法

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

作者头像
再见孙悟空_
发布2023-02-10 19:49:46
4120
发布2023-02-10 19:49:46
举报

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

代码语言:javascript
复制
float count = 6;
String num  = (count*0.7)+"";
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

代码语言:javascript
复制
float shoultScore = 6;
String actScore;
float num = (float) (Math.round(shoultScore * 0.7 * 1000)) / 1000;
actScore = num + "";
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档