我想用下面的0.000存储一个数字,它是最好使用的数据类型。
双人份?
另外,我猜INT是不可能的?
发布于 2009-09-04 18:47:20
decimal类型是最适合定点数学运算的。
来自C#规范第4.1.7节:
与float和double数据类型相反,小数小数(如0.1 )可以用decimal表示法精确表示。在浮点数和双精度表示法中,这样的数字通常是无限小数,这使得这些表示法更容易出现舍入错误。
发布于 2009-09-04 18:46:58
我仍然是一个十进制的粉丝,它可能会占用更多的空间,但没有浮点数和双精度的舍入误差。
这真的取决于你需要什么样的精确度和准确度,以及你希望存储的数字的类型。
例如,如果您使用的是货币,那么float或real中的舍入误差可能无论如何都是不可接受的。
当然,如果它是完全固定的,根据所需的值范围,您可以只需乘以1000并存储为整数类型,如short。
http://www.yoda.arachsys.com/csharp/floatingpoint.html中的舍入误差示例
double a = 0.65d;
double b = 0.05d;
Console.WriteLine("{0:r}", a + b); 请注意,在打印时{0:r}很重要,否则.net将舍入该值,并将其显示为0.7,即使它不完全是0.7。
经过几次计算,这样的舍入误差可能会增加。
发布于 2009-09-04 18:56:01
如果您正在处理小数,并且您的规范要求N位小数的精确精度,那么您唯一的选择是decimal,或者具有手动缩放的int/long (即,在进行输入/输出和算术时,根据需要乘以和除以1000 )。后者速度更快,表示更紧凑,前者更慢,更宽,但代码更短,更清晰。当然,您也可以将所有定点样板代码封装在您自己的struct中,它在幕后使用int/long。
请勿使用float或double。它们不能精确地表示许多小数。如果你总是四舍五入,你可以逃脱惩罚,但一旦你开始做算术或比较,这可能(通常会)绊倒你,因为舍入误差会累积。
https://stackoverflow.com/questions/1380871
复制相似问题