在C#中以下列方式从double转换为十进制是安全的:
int downtimeMinutes = 90;
TimeSpan duration = TimeSpan.FromHours(2d);
decimal calculatedDowntimePercent = duration.TotalMinutes > 0?
(downtimeMinutes / (decimal)duration.TotalMinutes) * 100.0m : 0.0m;
如果答案是肯定的,那就不用大惊小怪,我只会标记为已接受.
解决方法:
是的,它是安全的,因为十进制具有更高的精度
http://msdn.microsoft.com/en-us/library/364x0z75(VS.80).aspx
编译器将围绕其他非十进制数放置转换,但它们都适合十进制*(请参阅警告).
–
警告
> Decimal不是浮点类型.它的使命是始终坚持精确性.浮点数(例如double(我主要使用))会对精度进行折衷以适应非常大的数字).非常大或非常小的数字将不适合十进制.因此Lisa需要问自己,操作的幅度是否可能低于28个重要的数字位.对于大多数情况,28位有效数字已足够.
>浮点适用于天文数字大或数量非常小的数字……或者中间的操作可以产生足够的精度.我应该仔细研究一下,但是对于正负数十亿而言,双倍是可以的,精度可达几个小数点(最多7或8?).
>在科学领域,没有必要超出设备的准确度.在金融领域,通常逻辑选择是双重的,因为在大多数情况下,双精度计算效率更高(有时候他们想要更高的准确性,但效率不值得丢掉像十进制这样的东西).最后,我们都必须务实并将业务需求映射到数字领域.有些工具有动态数字表示.可能在.net中有相同的库.但是,值得吗?有时它是.通常它太过分了.