当前位置:编程学习 > C#/ASP.NET >>

VB.NET加减法运算小数点的问题

最近用VB.NET开发程序。遇到个莫名其妙的错误

当执行
for
sum+=formatnumber(*******,2)的时候
next
sum的结果并不是两位数。而是好多9,

提取数据出来觉得不是formatnumber函数的问题,出在那个加法运算。改成sum=sum+formatnumber(*******,2)还是一样的结果。而且formatnumber函数中包含减法运算的时候也会出现一些不会报错的未知错误。

请高手帮我解释一下VB.NET本身就有加减法运算出错的情况么?

还有就是我用同样的测试数据在台式机和笔记本上测试,结果就会不同这怎么解释阿?

谢谢高手,虚心学习中。。。 --------------------编程问答-------------------- lz用的是什麽數據類型?

很可能是溢出了超出了數據類型最大的值界了
  --------------------编程问答-------------------- 我用的double类型的啊  --------------------编程问答-------------------- 没人帮我解答阿?这让我怎么结帖呢?

我把我在别的地方求助的结果贴上来吧,

给那些现在还不明白的朋友一些启示:
------------------------------------------------
详细解说一下浮点类型
一般浮点小数是用二进制小数表示的,和整数部分类似,小数也是2的幂次方,只不过幂次是负数而已。 

例如:0.5(10)表示为0.1(2),通俗的说,就是2^-1,也就是1/2,同样:0.25(10)表示为0.01(2),即2^-2,也就是1/4。对于一个定长的小数,例如8位二进制小数,其实际的值就是所有位上的值相加而成,例如: 

0.75(10)=0.11(2)=1/2+1/4 

因此对于像0.1(10)这样的值需要很多值进行相加,设8位二进制小数,那么 

0.1(10) 可表示为 0.00011001(2) = 1/16+1/32+1/256 = 0.09765625 

或者 

0.1(10) 可表示为 0.00011010(2) = 1/16+1/32+1/128 = 0.1015625 

由于0.00011001和0.00011010之间已经没有可用的二进制表示了(相对于8位定长二进制小数来说),因此只能用这两个值来代替0.1,具体取那个根据实际的舍入规则确定,由此出现了误差。 

所以,对于二进制小数来说,只有2的负整数次幂的小数才能够精确表示,否则就可能出现误差。



------
decimal  double   single 的区别

decimal占16个字节,double-8个字节,single-4个字节

再精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。  
    
考虑下面的语句:  
    
      double  dd  =  10000000000000000000000d;  
              dd  +=  1;  
              Console.WriteLine  (  "{0:G50}",  dd  );  
        
输出是什么?谁知道?  
输出是:1000000000000000000000000  
    
    这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。  
    
  浮点数的精度损失可能在很多地方出现,例如d  *  g  /  g  不一定等于d,d  /  g  *  g也不一定等于d。  
    
    还有两个非常危险的错误认识!!  
    
  1、decimal不是浮点型、decimal不存在精度损失。  
    
  下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!  
        decimal  dd  =  10000000000000000000000000000m;  
                  dd  +=  0.1m;  
                  Console.WriteLine  (  "{0:G50}",  dd  );  
        
  2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。  
    
  微软在decimal的帮助上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。
--------------------编程问答-------------------- 浮点数精度问题,无论何种语言,都会有这种问题。
应该将计算结果用 Math.Round 取整到指定的小数位。 --------------------编程问答--------------------
引用 4 楼 Tiger_Zhao 的回复:
浮点数精度问题,无论何种语言,都会有这种问题。 
应该将计算结果用 Math.Round 取整到指定的小数位。


你能详细的说说么?谢谢 --------------------编程问答-------------------- 数太大了,超出精度范围,不如转换一下思路,用较小一点的数计算。例如先把小数点向前移几位再求和 --------------------编程问答--------------------
引用 4 楼 Tiger_Zhao 的回复:
浮点数精度问题,无论何种语言,都会有这种问题。 
应该将计算结果用 Math.Round 取整到指定的小数位。

楼上已经说的挺清楚的了。

浮点数(Floating Point Number)计算机系统中用于表达实数或者说小数的一种方式。由于其表达方式的原因,产生了围绕浮点数的许多常见问题。最典型的就是"为什么我的浮点运算的结果和想象的不同",即浮点数精度损失问题。
可以参照下:
http://stephensuen.spaces.live.com/Blog/cns!1p1G_DGhjYiYGmj6keNZQAcw!172.entry --------------------编程问答--------------------
引用 7 楼 yanlongwuhui 的回复:
引用 4 楼 Tiger_Zhao 的回复:
浮点数精度问题,无论何种语言,都会有这种问题。  
应该将计算结果用 Math.Round 取整到指定的小数位。 
 
楼上已经说的挺清楚的了。 

浮点数(Floating Point Number)计算机系统中用于表达实数或者说小数的一种方式。由于其表达方式的原因,产生了围绕浮点数的许多常见问题。最典型的就是"为什么我的浮点运算的结果和想象的不同",即浮点数精度损失问题。 
可以参照下: 
http://steph…

楼上已经说的挺清楚的了。  --------------------编程问答-------------------- 希望这个不是个水贴,

msth.round方法是采用就近舍入的方式,math.round(3.45,1)结果为3.4,如何解决4舍5入问题呢? --------------------编程问答-------------------- Console.WriteLine(Math.Round(3.45, 1, MidpointRounding.AwayFromZero)) --------------------编程问答-------------------- 好像没那么简单,呵呵.
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,