浮点数(float、double)精度损失问题

前言

以前简单了解过浮点数的精度损失问题,但是没有系统整理过。前段时间踩到了坑,是long类型转float类型进行计算与预期结果出现了差异,明明结果应该是整数但是却差了1点属性值,这里感谢QA测试的仔细。😂

原因

浮点数在计算机中是用二进制表示的,而有些十进制小数无法用二进制精确表示,例如0.1,0.2,0.3等。这样在进行浮点数运算时,就会出现一些误差,导致结果不准确。
详细原因就不赘述了,可以参考下面的两篇博客。
5分钟彻底搞懂"浮点数精度丢失"问题
Unity3D研究院之被坑了的浮点数的精度

解决方案

1. 如果对精度要求不是特别高,可以使用Math类中的一些方法,例如Math.RoundMath.FloorMath.Ceiling等,可以对浮点数进行四舍五入,向下取整,向上取整等操作。

//Math.Round是我们在实际开发中经常使用的进行四舍五入的方法,但是一定要注意,
//C#中的Round()不是四舍五入,是符合IEEE标准的四舍五入,
//具体是四舍六入,如果遇5则前一位如果是偶数则舍掉,如果是奇数则进一位。
double num1 = Math.Round(2.455,2);//得到的值是2.46

//使用Math.Round()的重载函数,四舍五入,保留两位数据
//这种方式才是我们中国人理解的四舍五入。
double num2 = Math.Round(2.455,2,MidpointRounding.AwayFromZero);//得到的值是2.46

2. 使用 decimal 类型,它拥有更高的精度。虽然decimal也会出现精度丢失问题,但是一般业务需求是没问题的。
3. 如果需求数值精确,那么就尽量避免使用浮点数,比如我们项目中战斗系统涉及的数值都是用万分比去做的,10000代表1,计算就变成了整数间的计算。
4. 使用高精度运算的类库,比如BigDecimal,但是要注意传入字符串而不是浮点数,否则还是会有误差。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我寄人间雪满头丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值