【问题标题】:Test whether a decimal value can be converted to double测试一个十进制值是否可以转换为双精度
【发布时间】:2019-11-09 16:40:22
【问题描述】:

有什么好方法可以测试decimal 值是否可以转换为double 而不会引发异常,最好不要转换为字符串并从字符串中解析?

我可以测试与longint 类型的兼容性,如下所示:(尚未测试)

if (value == decimal.Truncate(value))
{
    if (value >= int.MinValue && value <= int.MaxValue)
        return (int)value;
    if (value >= long.MinValue && value <= long.MaxValue)
        return (long)value;
    return value.ToStringInvariant();
}
// Now try double, else revert to string again

此方法应该用于将decimal 值序列化为可以发送到 JavaScript 的内容。这里使用了 MessagePack,但 JSON 应该具有相同的约束。两者都不支持decimal

我可以始终将值发送为string,但我想节省一点带宽并使用可以表示该值的最简单类型(具有不错的精度)。

PS:这不会编译:

if (value >= double.MinValue && value <= double.MaxValue)
    return (double)value;

我无法将decimaldouble 进行比较。如果这是一条好路,那将是一个好的解决方案吗?

【问题讨论】:

  • 注意,“可以转换而不扔”和“可以转换而不损失精度”是两个不同的东西
  • 我知道。精确的精度在这里并不重要,因为 JavaScript 无论如何都无法使用它。抛出异常以找出转换失败是不可接受的。我将转换大量的值。
  • 在这种情况下,双精度的范围明显大于小数的范围,因此您始终可以将小数转换为双精度。您可能会失去精度,因为小数的精度比小数高很多位,但如果这不重要......

标签: c# .net decimal


【解决方案1】:

有什么好方法可以测试十进制值是否可以转换为double而不抛出异常?

static bool CanBeConvertedToDouble(decimal d)
{
  return true;
}

:)

所有小数都可以转换成双精度。

请注意,这样做可能会损失大量的精度。一个小数有大约 29 个小数位的精度;双打只有15个左右。但是将小数转换为双精度永远不会丢失幅度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多