浅析"圆整"错误与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

浙公网安备 33010602011771号