浅析"圆整"错误与Convert类

float value = 50.35f;
uint dollors = (uint)value;
ushort cents = (ushort)((value - dollors) * 100);
Console.WriteLine(cents.ToString());

       结果: 34

       为什么结果不是35而是34呢?

========================================================================
圆整:
       通常理解为数据修正。
       一个直观的例子是:
       我们按一系列数据绘制一条曲线(或直线)时,将偏离该轨迹的数据坐标修正到该轨迹上,以使线条平滑。这就叫数据圆整。
       例如,14.6若按四舍五入法圆整则为15,但在物理测量上,若测量为14.2mm,为减小误差,有时会圆整到15mm,视测量要求来定。

[内容来自“百度百科”]
========================================================================

援引《Professional C# 2005 with .NET 3.0》P167描述

此问题是由圆整错误引起的。如果类型转换用于把float转换为uint,计算机就会截去多余的数字,而不是圆整它。计算机以二进制方式存储数字,而不是十进制,小数部分0.35不能用二进制小数来表示(像1/3这样的分数不能表示为小数,它应等于循环小数0.3333)。所以,计算机最后存储了一个略小于0.35的值,它可以用二进制格式表示。……,避免该错误的方式是确保在数字转换过程中执行智能圆整操作。Microsoft编写了一个类System.Convert来完成该任务。System.Convert包含大量的静态方法来执行各种数字转换,我们需要使用的是Convert.ToUInt16()。 注意,在使用System.Convert方法时会产生额外的性能损失,所以只应在需要时才使用它们。

========================================================================

float value = 50.35f;
uint dollors = (uint)value;
ushort cents = Convert.ToUInt16((value - dollors) * 100); 

Console.WriteLine(cents.ToString());

另外,当在使用Convert截断数据时,舍入为最接近的 32 位带符号整数。 (四舍五入)

如果 value 为两个整数中间的数字,则返回二者中的偶数;即 4.5 转换为 4,而 5.5 转换为 6。

例如

Console.WriteLine("3.4:{0}\n3.5{1}", Convert.ToInt32(3.4), Convert.ToInt32(3.5));

显示:

3.4:3
3.5:4

计算机中用二进制存储数字,当我们存入一个浮点数时,它的值就已经不是我们以为的值了。

例如:

float f = 3.14f;
double b = f;
Console.WriteLine("float:{0}\ndouble:{1}", f.ToString(), b.ToString());
Console.Read();

显示:

float:3.14
double:3.14000010490417

posted @ 2011-12-29 12:50  Silence_  阅读(581)  评论(0)    收藏  举报