float long类型转换

xiaomo_820427 2012-08-31 08:35:21
昨天遇到一件事情觉得很奇怪,基本确定是类型转换引起的,
刚刚写了一小段测试一下果真如此(c#.net)
float a=8.15f;
long b= (long)(a*1000);

结果b=8149
又用其他几个值测试了一下,基本正常,但是当a*1000的最后一位是0时就会出现比预计值少1的情况

如 8150-8149
8160-8159
类推


谁知道是什么原因呢,如果是位数过多什么还能从类型的长度去考虑,现在很晕




...全文
1309 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝_爸 2012-08-31
  • 打赏
  • 举报
回复
就像十进制不能精确表示1/3,而三进制可以精确表示一样。

有些数字十进制可以精确表示,但是二进制不能精确表示。
zzz82103 2012-08-31
  • 打赏
  • 举报
回复
用double就可以了,float存在精度误差的,比如1.5f,监视里就是1.499999999,双精度的话用double就可以了
xiaomo_820427 2012-08-31
  • 打赏
  • 举报
回复
代码不是我写的,我只负责维护而已,昨天运行了好久的程序突然出现异常才查出来是这么个问题,可以解决,但总是想知道为什么
cheng2005 2012-08-31
  • 打赏
  • 举报
回复
楼主先弄清楚什么是浮点数。
然后再明白一个事实,浮点数做运算本身就是不精确的。
这些都属于基础知识的内容,不扎实的人也许好久才会发现。
偶是小谢 2012-08-31
  • 打赏
  • 举报
回复
不好意思,我这里运行了一下,显示仍然为8150……
宝_爸 2012-08-31
  • 打赏
  • 举报
回复
这篇文章好一点
Java中用浮点型数据Float和Double进行精确计算时的精度问题
http://www.cnblogs.com/n-u-l-l/archive/2012/05/12/2497063.html

C#也有同样问题,所有语言都有同样的问题,只要计算机是二进制的。
宝_爸 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这里有文章:

浮点数的二进制表示
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

我自己还真说不了这么清楚。
[/Quote]

这篇文章不对lz的问题,lz别读了。
xcf007 2012-08-31
  • 打赏
  • 举报
回复
8.15,这个计算机并不会精确的存的8.15的,计算机有精度问题,十进制转二进制也没那么巧除的尽。
宝_爸 2012-08-31
  • 打赏
  • 举报
回复
这里有文章:

浮点数的二进制表示
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

我自己还真说不了这么清楚。
SQL77 2012-08-31
  • 打赏
  • 举报
回复
float是近似。
换成DOUBLE或DECIMAL
宝_爸 2012-08-31
  • 打赏
  • 举报
回复
应该是二进制float没法精确表示8.15吧。
assky124 2012-08-31
  • 打赏
  • 举报
回复
计算机精度问题,不行就换Double
愚知 2012-08-31
  • 打赏
  • 举报
回复

四舍五入,五舍六入

110,534

社区成员

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

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

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