C#哪个是精度3的最佳数据类型?

时间:2009-09-04 18:39:30

标签: c# .net types precision

我想存储一个带有以下0.000的数字,这是要使用的最佳数据类型。

双重?

另外我猜一个INT是不可能的?

12 个答案:

答案 0 :(得分:26)

decimal类型最适合定点数学。

来自C#规范第4.1.7节:

  

与浮动和双重数据相反   类型,十进制小数等   因为0.1可以准确表示   十进制表示。在里面   float和double表示,例如   数字通常是无限分数,   使这些陈述更多   容易出现四舍五入的错误。

答案 1 :(得分:6)

我仍然是十进制的粉丝,它可能需要更多的空间,但没有完全相同的舍入错误浮动和双倍。

这实际上取决于您需要的精确度和准确度以及您希望存储的数字类型。

如果您正在使用资金,那么无论如何浮动或真实的舍入错误都可能是不可接受的。

当然,如果它完全固定,根据所需的值范围,你可以乘以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。

在几次计算中,可以增加这种舍入误差。

答案 2 :(得分:4)

如果您正在处理十进制数字,并且您的规范要求N 十进制位置具有精确的精度,那么您唯一的选项是decimal或{{带有手动缩放的1}} / int(即在进行输入/输出和算术时根据需要乘以和除以1000)。后者更快,表示更紧凑,前者更慢更宽,但代码更短更清晰。当然,您也可以将所有定点样板代码封装在您自己的long中,其中使用了struct / int

不要使用longfloat。它们不能完全代表许多小数部分。如果你总是一致地围绕它,你就可以逃脱它,但是一旦你开始进行算术或比较,这可能(并且通常会)绊倒你,因为四舍五入的错误会累积。

答案 3 :(得分:3)

根据yopu表示文件大小的注释,考虑将字节存储为整数或长整数...这样可以完全避免问题,避免将1 / 1024th KB转换为double或float所固有的舍入误差希望更接近您所代表的真实世界的测量。

答案 4 :(得分:2)

float是7位精度。 double是15位精度。

所以浮动就足够了

答案 5 :(得分:2)

我的建议是,使用float。要获得更高的精度,请使用double和更精确的使用decimal。

答案 6 :(得分:1)

Int非常适合您。你会浪费内存和十进制,如果你只使用3位小数,你总是记得乘以/除以1000。

无论如何,如果你将它用于财务方面,那可能会很烦人 - 无论如何都坚持使用小数。

如果你将它用于某种类型的单位,比如持续时间或长度,那么int适合你,因为你可以从几秒到几毫秒,或从米到毫米。

如果您解释了所需的用途,那将会很有帮助。

另外,根据我在MSDN上看到的信息,十进制就像浮点一样,但精度更高,没有舍入。

此外:十进制 - 16字节,int - 4字节

除非你的int除以1000,否则其范围仅为+/- 2,147,483

编辑:

我读了你的评论,你想使用if for filesize?如果是这样,我不知道小数来自哪里......也许它们只是为了显示?

无论如何,请在这里使用Int64。

答案 7 :(得分:0)

漂浮会更好。

答案 8 :(得分:0)

如果是文件大小,您可以将大小从千字节更改为字节或从更小的范围(兆字节到千磅)更改,并且没有任何浮动并保持相同的精度。

否则,双倍会很好。

答案 9 :(得分:0)

浮点数“精确”到大约6位小数,双精度“精确”到更高的精度。但是,它们都不能准确地表示每个3位小数值。

你有可能使用浮点数,只要你不介意像0.123这样的数字存储为0.122999999 ......稍微仔细的舍入应该足以实现你想要的。

如果你想完全代表所有可能的3位小数位数,你最好使用一个整数并将这些值乘以1000.即值3.456将存储在整数为3456。

答案 10 :(得分:0)

您想以这种方式存储这个数字,还是存在呢?尽可能精确地存储并格式化为#.000。存储您的号码不太可能是存储问题,所以继续使用太大的东西。

如上所述,整数可以适用于可以减少为整数值的事物。 (显示GB,将字节存储为int或bigint;显示天数,将秒存储为bigint)

答案 11 :(得分:0)

对于文件大小(似乎是您希望存储的文件大小),请使用long(Int64)来存储字节数。如果您知道文件小于2GB,请使用int。然后,您可以convert this to a more human readable form using a simple method

相关问题