dkinyee 2011-03-22 11:51
虽然double类型有精度问题,但是(int)强制转换是不应该使用的。
int a = (int)(19.9 *100); //19.9默认是double类型
强制类型转换为int,只会保留整数部分,即使 d=1989.999999,转换后也成了1989,应该使用Convert类
int a= Convert.ToInt32(19.9 * 100)
a=1990
畅想自由 2010-12-23 14:08
@李晓强
其实最纠结的就是后面那个貌似很随机出现的问题。但最近事情多一直没得时间去搞清楚。你说的有篇文章,不知道能否给个URL?谢谢。
李晓强 2010-12-23 14:01
既然知道溢出了,那就不必纠结了吧.
另外院子里面好像有位仁兄专门针对你的这篇文章写了一篇文章,那篇文章写的很好的.
不过也怪代码写的方式的问题(直接取整会丢失的嘛.呵呵.四舍五入就好多了.),大多数的情况下double类型是足够的.
关于标题的事情,反正如果是我的话,估计会被误导.
畅想自由 2010-12-23 13:50
已经修改标题,如果给大家造成误解,请见谅。
畅想自由 2010-12-23 13:49
@李晓强
呵呵,你太多虑了。不过,我会考虑去掉。
畅想自由 2010-12-23 13:47
@李晓强
我并没有拒绝理解的意思,但你确实没有说清楚哈。请认真看我的文章,我并不是不知道有溢出。当然,如果你认为不值得说明,或者不值得讨论,那就算了。
李晓强 2010-12-23 13:44
最后,我看不中的就是楼主标题里面:
"不靠谱的.NET double类型."
我所表达的意思是:.net 只是忠实的实现了double类型,不多不少,刚刚好.请不要在前面加个.NET,否则新手可能会形成一种认识:.NET 真LJ,double 类型运算都会出垃圾错误".请把.net去掉好么?
李晓强 2010-12-23 13:41
[quote]Daniel Zheng:
@李晓强
空格的地方不对,符号位掉了。[/quote]
空格的地方如何不对?
你指出一下,我好学习.呵呵.
符号位的话,如果我没有记错的话,应该是第一位吧.这也是我在第一位后面加个空格的原因.
李晓强 2010-12-23 13:40
[quote]畅想自由:
@李晓强
谢谢你的回复,但回复中有几处“可能”,我想知道的是为什么而不是“可能”,你说的我都了解,其实我们一直用decimal只是这个地方以前的代码用了double。我们也知道decimal的精度是比double要高。[/quote]
如果你不明白我表达的意思,而只是一味的拒绝去理解我的意思的话,你就当我没说吧.
李晓强 2010-12-23 13:39
[quote]畅想自由:
@李晓强
我用JAVA测试了,JAVA也是这个问题。应该是二进制运算溢出的原因。
但还没有找到,为什么有些数字是对的,有些数字不对的原因。[/quote]
呵呵,double表示形式的标准是统一的,所以不需要试JAVA,而且我也没哟JDK,这正是我加一个 "估计Java也会如此" 的原因,但是我后面 "这个结果具有必然性" 是因为double的表示是个标准,与语言无关.
徐少侠 2010-12-23 10:16
什么年头么
浮点数的老问题了
gongji 2010-12-23 04:34
曾经看过一个很牛逼的,业内很有名的酒店管理系统,单价用float,总价用double
iImax 2010-12-22 15:48
mark 以后做支付系统记住了
Daniel Zheng 2010-12-22 13:29
@李晓强
空格的地方不对,符号位掉了。
Daniel Zheng 2010-12-22 11:43
@畅想自由
我也来说两句。
二进制无法精确表示浮点数,小数部分一般都是用近似值来标示的。所以19.9*100的二进制标示会有那么多的11111111。而(int)(19.999999999)结果是直接截断小数点后面的结果,所以1989.999999也就是1989了。但是decimal为什么能正确呢,因为它根本就不存在真正的小数存储进制,所有的数都在小数点的右边。那它又是如何存储小数的呢,答案就是比例因子。当然还有符号位。
谢谢大家。
畅想自由 2010-12-22 09:50
@李晓强
我用JAVA测试了,JAVA也是这个问题。应该是二进制运算溢出的原因。
但还没有找到,为什么有些数字是对的,有些数字不对的原因。
畅想自由 2010-12-22 09:20
@李晓强
还有“你用Java来干估计也是这个结果,这个结果具有必然性”。
请不要估计,是不是确实如此?如果你测试了,我很高兴看到你的结果。
谢谢。
畅想自由 2010-12-22 09:16
@李晓强
谢谢你的回复,但回复中有几处“可能”,我想知道的是为什么而不是“可能”,你说的我都了解,其实我们一直用decimal只是这个地方以前的代码用了double。我们也知道decimal的精度是比double要高。
HCOONa 2010-12-22 09:08
Math.Round貌似可以四舍五入,应该还有celling,floor之类的函数,你看着需要来吧
李晓强 2010-12-22 00:07
PS:如果你先Round一下再进行取整的话最多只会丢失半分钱.
没有绝对的精确,只有足够的精确.