十进制 - 截断尾随零

时间:2010-04-26 15:25:04

标签: c# decimal

我注意到.NET在小数和尾随零时有一些时髦/不直观的行为。

0m == 0.000m //true
0.1m == 0.1000m //true

(0m).ToString() == (0.000m).ToString() //false
(0.1m).ToString() == (0.1000m).ToString() //false

我知道必须遵守ECMA CLI标准。 但是我想知道是否有内置的方法来截断十进制值的尾随零而不通过字符串表示(.ToString(“G29”)和解析后退技巧可行,但既不是快速也不是优雅的解决方案) ?

有什么想法吗? 非常感谢。

3 个答案:

答案 0 :(得分:17)

我认为你需要的是这个(我的回答here中的更多细节):

public static decimal Normalize(decimal value)
{
    return value/1.000000000000000000000000000000000m;
}

答案 1 :(得分:7)

使用格式字符串指定ToString()的输出:

(0.1m).ToString("0.#") -> "0.1"
(0.10000m).ToString("0.#") -> "0.1"

在格式中使用“0”指定数字或非指数0,使用“#”指定有效数字或抑制非有效数字0。

编辑:我在这里假设您担心数字的视觉(字符串)表示 - 如果没有,我会删除我的答案。

答案 2 :(得分:3)

我不喜欢它,但它有效(至少对某些值而言)......

    static decimal Normalize(decimal value)
    {
        long div = 1;
        while(value - decimal.Truncate(value) != 0)
        {
            div *= 10;
            value *= 10;
        }
        if(div != 1) {
            value = (decimal)(long)value / div;
        }
        return value;
    }