限制双倍到3位小数

时间:2010-09-28 15:09:49

标签: c# double truncate

这就是我想要实现的目标:

如果double的小数位数超过3个,我想截断第三个小数位以外的任何小数位。 (不要回合。)

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

8 个答案:

答案 0 :(得分:60)

双打没有小数位 - 它们不是以十进制数字开头的。当截断为三位小数时,你可以得到“与当前值最接近的两倍”,但它仍然不会完全相同。你最好使用decimal

话虽如此,如果只是圆角发生的方式是一个问题,你可以使用{em>可以做你想要的Math.Truncate(value * 1000) / 1000;。 (根本不需要舍入。)但它仍然可能“狡猾”,因为结果仍然不会真正只有三个小数位。但是,如果您使用小数值执行相同操作,则工作:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878
编辑:正如LBushkin指出的那样,你应该清楚地截断 display 目的(通常可以在格式说明符中完成)和截断以进行进一步的计算(在这种情况下上面应该有效) )。

答案 1 :(得分:38)

我无法想到在显示目的之外明确失去精度的原因。在这种情况下,只需使用字符串格式。

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));

答案 2 :(得分:18)

double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));

答案 3 :(得分:7)

乘以1000然后使用Truncate然后除以1000。

答案 4 :(得分:5)

如果截断数字的目的是出于显示原因,那么只需在将double转换为字符串时使用适当的格式。

String.Format()Console.WriteLine()(及其他)等方法允许您限制格式化值的精度位数。

建议尝试“截断”浮点数 - 在许多情况下,浮点数没有精确的十进制数。应用一种方法,比如缩放数字,截断数字,然后将其缩小,可以轻松地将值更改为与“截断”值的预期值完全不同的值。

如果您需要对数字进行精确的十进制表示,则应使用decimal而不是doublefloat

答案 5 :(得分:3)

您可以使用:

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;

答案 6 :(得分:1)

上面的好答案 - 如果你正在寻找可重复使用的东西,那就是代码。请注意,您可能需要检查小数位数值,这可能会溢出。

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));

    return Math.Truncate((power * numberToTruncate)) / power;
}

答案 7 :(得分:1)

在C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}
相关问题