4.1*100.0f=409.99999999999994 的问题。求教!

yfl168648 2015-03-25 09:25:36


如图。发现软件计算出的金额,有时候会错误,才发现是这里的问题,我完全没有头绪,为什么会这样?

改为float就没这问题了,但是百思不得其解啊
...全文
188 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
var x = 100.111d * 100.1f;
            var y = 100.111d * 100.1f;
            Console.WriteLine((double)100.1f);
            Console.WriteLine(x);
            Console.WriteLine(y);
            Console.WriteLine(x == y);
            x = 100.111d * 100.1d;
            y = 100.111d * 100.1d;
            Console.WriteLine(x);
            Console.WriteLine(y);
            Console.WriteLine(x == y);
我做了个实验,只要相同类型,就不存在精度问题,但一旦强转(隐式转换)就会有精度问题
yfl168648 2015-03-25
  • 打赏
  • 举报
回复
问题虽解决,但经研究发现,不仅是c#,java,python我试了,都这样子。
yfl168648 2015-03-25
  • 打赏
  • 举报
回复
使用decimal问题已解决。看来c#的精度问题,有待研究啊。感谢各位!
yfl168648 2015-03-25
  • 打赏
  • 举报
回复
100.0f只是写习惯了。。。其实100我也试了。100.0d 100 100d

我一开始以为问题能解决,只是觉得有些莫名其妙,现在问题还没解决。。

准备试试decimal。

上个图你看看
  • 打赏
  • 举报
回复
话说你为啥一定要乘以100f呢?100就可以了,不用显示声明成float
  • 打赏
  • 举报
回复
你就用decimal吧,这个没精度问题
yfl168648 2015-03-25
  • 打赏
  • 举报
回复
money="4.1"; long nMoney = (long)(float.Parse(money) * 100.0f); 我以为这样就解决问题了。结果……nMoney值为409. 已跪!
  • 打赏
  • 举报
回复
说真的,我一直没搞懂net的float和double,精度问题在这两个上面我完全没看懂,求大神解释
  • 打赏
  • 举报
回复
还是说因为100.0f也是float类型,两个相乘不存在提升问题 即float*float没精度提升问题 double*float,float会被隐式的提升成double,然后导致这样的结果
yfl168648 2015-03-25
  • 打赏
  • 举报
回复
又试了两个,难道是double类型的1不等于1? 1.1*100.0=110.00000000000001 2.2*100=220.00000000000003
本拉灯 2015-03-25
  • 打赏
  • 举报
回复
为是四舍五入吧
  • 打赏
  • 举报
回复
两个都有精度问题的啊,为啥float对的,double不对……

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧