我想用以下 0.000 存储一个数字,这是最好的数据类型。
双标?
另外我猜INT是不可能的?
该decimal
类型最适合定点数学。
从 C# 规范第 4.1.7 节:
与 float 和 double 数据类型相反,十进制小数(例如 0.1)可以精确地以十进制表示形式表示。在 float 和 double 表示中,这些数字通常是无限小数,这使得这些表示更容易出现舍入错误。
我仍然是十进制的粉丝,它可能需要更多的空间,但没有完全相同的舍入误差 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);
请注意,{0:r}
打印时很重要,否则 .net 会将值四舍五入,即使它不完全是 0.7,它也会显示为 0.7。
经过多次计算,这种舍入误差可能会增加。
如果您正在处理十进制数,并且您的规范要求 N个小数位的精确精度,那么您唯一的选择是decimal
, 或int
/long
手动缩放(即在进行输入/输出和算术时根据需要乘以和除以 1000)。后者速度更快,表示更紧凑,前者更慢更宽,但代码更短更清晰。struct
当然,您也可以将所有使用int
/的定点样板代码封装在您自己的内部long
。
不要使用float
或double
。它们不能精确地表示许多小数。如果你总是四舍五入,你可以侥幸逃脱,但是一旦你开始做算术或比较,这可能(而且通常会)绊倒你,因为舍入误差会累积。
根据您对 yopu 表示文件大小的评论,考虑将字节存储为整数或长整数......这完全避免了您的问题,避免了将 1/1024 KB 转换为双精度或浮点数时固有的舍入错误,并且具有优势更接近您所代表的实际测量值。
float 是 7 位精度。double 是 15 位精度。
所以浮动就绰绰有余了
我的建议是,使用浮动。要获得更高的精度,请使用双精度,而要获得更高的精度,请使用十进制。
浮点数“精确”到小数点后 6 位,双精度数“精确”到更高的精度。但是,它们都不能准确地表示每个 3 位小数位的值。
只要您不介意将 0.123 之类的数字存储为 0.122999999,您可能会很好地使用浮点数......稍微仔细的舍入应该足以实现您想要的。
如果您想准确表示所有可能的 3 位小数部分,最好使用整数并将值乘以 1000。即 3.456 的值将存储在整数中为 3456。
Int 非常适合您。你会用小数浪费内存,如果你只使用 3 个小数位,你总是可以记住乘/除以 1000。
无论如何,如果你将它用于财务,那可能会很烦人——然后还是坚持使用小数。
如果您将它用于某种单位,例如持续时间或长度,int 将适合您,因为您总是可以从秒到毫秒,或从米到毫米。
如果您解释了它的预期用途,那将会很有帮助。
此外,从我在 MSDN 上看到的信息来看,十进制就像浮点数一样,但精度更高且没有四舍五入。
进一步:十进制 - 16 字节,整数 - 4 字节
但是,您的 int 除以 1000 的范围仅为 +/-2,147,483
编辑:
我阅读了您的评论,您想使用 if 文件大小吗?如果是这样,我看不出小数是从哪里来的……也许它们只是为了显示?
无论如何,在这里使用 Int64。
浮动会更好。
如果是针对文件大小,您可以将大小从千字节更改为字节或从较小的范围(兆到千字节)更改,并且没有任何浮动并保持相同的精度。
否则,双倍会很好。
你想以这种方式存储号码,还是展示它?以尽可能高的精度存储并将其格式化为#.000。存储您的号码不太可能是存储问题,所以继续使用太大的东西。
如前所述,整数可能适用于可以简化为整数值的事物。(显示 GB,将字节存储为 int 或 bigint;显示天数,将秒存储为 bigint)
对于似乎是您希望存储的文件大小,请使用 long (Int64) 来存储字节数。或者如果您知道文件将小于 2GB 左右,请使用 int。然后,您可以使用一种简单的方法将其转换为更易于阅读的形式。