限制双精度到3位小数
这是我正在努力实现的:
如果一个double有三个以上的小数位,我想截断第三个以外的任何小数位。 (不要绕)
Eg.: 12.878999 -> 12.878
如果双精度小于3位,保持不变
Eg.: 125 -> 125 89.24 -> 89.24
我碰到这个命令:
double example = 12.34567; double output = Math.Round(example, 3);
但我不想轮。 根据上面发布的命令, 12.34567 -> 12.346
我想截断值,使其成为: 12.345
双打没有小数位 – 他们不是基于十进制数字开始。 你可以得到“最接近两倍于当前值时截断到三位小数”,但它仍然不会完全相同。 你最好用decimal
。
话虽如此,如果这只是发生舍入的方式,那么可以使用Math.Truncate(value * 1000) / 1000;
这可能会做你想要的。 (你根本不需要四舍五入 ,但是它仍然是潜在的“狡猾”,因为结果仍然不会有三位小数。 如果你用十进制值做了同样的事情,那么它将起作用:
decimal m = 12.878999m; m = Math.Truncate(m * 1000m) / 1000m; Console.WriteLine(m); // 12.878
编辑:正如LBushkin指出,你应该明确截断显示目的(通常可以在格式说明符)和截断进一步计算(在这种情况下,上述应该)。
我不能想到在显示目的之外明确地失去精度的理由。 在这种情况下,只需使用string格式。
double example = 12.34567; Console.Out.WriteLine(example.ToString("#.000"));
double example = 3.1416789645; double output = Convert.ToDouble(example.ToString("N3"));
乘以1000,然后使用截断,然后除以1000。
如果你截断数字的目的是出于显示的原因,那么当你将double转换为一个string时,你只需要使用适当的格式。
像String.Format()
和Console.WriteLine()
(及其他)的方法允许限制一个值被格式化的精度的位数。
试图“截断”浮点数是不好的 – 浮点数在许多情况下没有精确的十进制表示。 应用像缩放数字,缩小数字,然后缩小数字的方法可以很容易地将数值改变为与“截断”值相比完全不同的数值。
如果你需要精确的数字十进制表示,你应该使用decimal
而不是double
float
或float
。
您可以使用:
double example = 12.34567; double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
上面的好答案 – 如果你正在寻找可重用的东西是代码。 请注意,您可能想要检查小数位的值,这可能会溢出。
public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces) { decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces)); return Math.Truncate((power * numberToTruncate)) / power; }
在C lang:
double truncKeepDecimalPlaces(double value, int numDecimals) { int x = pow(10, numDecimals); return (double)trunc(value * x) / x; }