限制双精度到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 floatfloat

您可以使用:

 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; }