将双精度浮点数转换为十进制数,必要时对其进行截断。

3

我有一个double类型的值,需要将其转换为十进制(decimal)。如果该值过大/过小,则结果应为decimal.MaxValue/decimal.MinValue。最佳方法是什么?


你尝试过什么?当你说“最好”的时候,你优化的是什么?可读性?性能?“正确性”?还是其他什么? - Oded
2个回答

3

我想你应该意识到这是一种有损转换,如果可能的话应该避免使用。如果确实需要进行此操作:

private static readonly double MaxDecimalAsDouble = (double) decimal.MaxValue;
private static readonly double MinDecimalAsDouble = (double) decimal.MinValue;

...
public decimal ConvertWithCap(double input)
{
    return input >= MaxDecimalAsDouble ? decimal.MaxValue
         : input <= MinDecimalAsDouble ? decimal.MinValue
         : (decimal) input;
}

这种方法是通过检查 double 值的方式来检查帽子,但然后硬编码返回被截断的十进制值。这避免了 double 无法准确表示 decimal 的最大/最小值的问题。(即使在 decimal 的最大规模下,连续整数也可以被表示-但对于 double 则不是这种情况。)

很遗憾,我使用的API需要这样做。我也想到了你的解决方案,但是放弃了它。我的问题是,在溢出的情况下,得到的十进制数不是decimal.MaxValue。 - ctusch
我曾认为十进制数比双精度浮点数更大,因此将decimal.MaxValue强制转换为double应该返回double.MaxValue,同样地,对于decimal.MinValue和double.MinValue也是如此。 - Surya Pratap
@SuryaPratap:不行,因为表示方式的差异意味着decimal.MaxValue不能被精确地表示为double - Jon Skeet
@JonSkeet 您是对的,我的错;) 我只是在检查引用,因为我不知道这个。 - Surya Pratap

0
你认为 double 类型的大值和小值应该是多少呢?我觉得一个简单的 if else 语句就可以完成这个任务。
public decimal getDecimal(double value,double large,double small)
{

    if(value <= large && value >= small)
     return (decimal) value;
    else if (value>large)
     return decimal.MaxValue;
    else
     return decimal.MinValue;
}

这只是在网站上输入的,所以请原谅语法和拼写错误


我不知道是否表达得不够清楚:大和小的边界就是 decimal.MaxValue 和 decimal.MinValue。 - ctusch
@user232986 我现在明白了,我之前不知道将 double 强制转换为 decimal 时会抛出异常。 - Surya Pratap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接