Mat*_*ell 26
该decimal类型是定点数学的最佳选择.
从C#规范4.1.7节:
与float和double数据类型相反,十进制小数(如0.1)可以用十进制表示形式表示.在float和double表示中,这样的数字通常是无限分数,使得这些表示更容易出现舍入错误.
我仍然是十进制的粉丝,它可能需要更多的空间,但没有完全相同的舍入错误浮点数和双倍.
这实际上取决于您需要什么样的精度和准确度以及您希望存储的数字类型.
例如,如果你正在使用金钱,那么浮动或真实的舍入错误无论如何都可能是不可接受的.
当然,如果它完全固定,根据所需的值范围,你可以乘以1000并存储为整数类型,如short.
来自http://www.yoda.arachsys.com/csharp/floatingpoint.html的示例舍入错误
double a = 0.65d;
double b = 0.05d;
Console.WriteLine("{0:r}", a + b);
Run Code Online (Sandbox Code Playgroud)
注意,{0:r}在打印时很重要.net会对值进行四舍五入,即使它不是0.7,它也会显示为0.7.
在几次计算中,可以增加这种舍入误差.
如果您正在处理十进制数字,并且您的规范要求 N 位小数的精确精度,那么您唯一的选择是decimal, 或int/long手动缩放(即在进行输入/输出和算术时根据需要乘以和除以 1000)。后者更快并且具有更紧凑的表示,前者更慢且更宽,但代码更短且更清晰。当然,您也可以将所有定点样板代码封装在您自己的代码中,在底层struct使用int/ 。long
不要使用float或double。它们不能准确地表示许多小数。如果您始终一致地舍入,您可以逃脱它,但一旦您开始进行算术或比较,这可能(并且通常会)使您绊倒,因为舍入误差会累积。
| 归档时间: |
|
| 查看次数: |
4841 次 |
| 最近记录: |