【发布时间】:2019-11-09 16:40:22
【问题描述】:
有什么好方法可以测试decimal 值是否可以转换为double 而不会引发异常,最好不要转换为字符串并从字符串中解析?
我可以测试与long 或int 类型的兼容性,如下所示:(尚未测试)
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;
我无法将decimal 与double 进行比较。如果这是一条好路,那将是一个好的解决方案吗?
【问题讨论】:
-
注意,“可以转换而不扔”和“可以转换而不损失精度”是两个不同的东西
-
我知道。精确的精度在这里并不重要,因为 JavaScript 无论如何都无法使用它。抛出异常以找出转换失败是不可接受的。我将转换大量的值。
-
在这种情况下,双精度的范围明显大于小数的范围,因此您始终可以将小数转换为双精度。您可能会失去精度,因为小数的精度比小数高很多位,但如果这不重要......