在.net中,如何在十进制和双精度之间进行选择
前几天我们在工作中讨论过这个问题,我希望有一个Stackoverflow问题,我可以告诉大家,就这样吧。)在.net中,如何在十进制和双精度之间进行选择,.net,floating-point,.net,Floating Point,前几天我们在工作中讨论过这个问题,我希望有一个Stackoverflow问题,我可以告诉大家,就这样吧。) a和a的区别是什么 什么时候(在什么情况下)您应该始终使用双重密码 什么时候(在什么情况下)应该始终使用十进制 在不属于上述两大阵营之一的情况下,需要考虑的驱动因素是什么 有很多问题与这个问题重叠,但它们往往是问某人在给定情况下应该做什么,而不是在一般情况下如何决定。如果你想保持真正的精确性,请使用十进制 如果要比较值,请使用decimal 如果您使用双倍并执行此操作 ? ctype(
- a和a的区别是什么
- 什么时候(在什么情况下)您应该始终使用
双重密码
- 什么时候(在什么情况下)应该始终使用
十进制
- 在不属于上述两大阵营之一的情况下,需要考虑的驱动因素是什么
有很多问题与这个问题重叠,但它们往往是问某人在给定情况下应该做什么,而不是在一般情况下如何决定。如果你想保持真正的精确性,请使用十进制 如果要比较值,请使用decimal 如果您使用双倍并执行此操作
? ctype(1.0, Double ) / 3
? ctype(1.0, Decimal ) /3
你会得到
0.33331
如果使用十进制并执行此操作
? ctype(1.0, Double ) / 3
? ctype(1.0, Decimal ) /3
你会得到
0.3333333D
还有一个例子,极端的例子
decimal dec = new decimal(1, 1, 1, false, 28);
var dou = (double)dec;
会产生这个,double会失去一些精度
??窦0.00000000 18446744078004519
? 十二月
0.0000000018446744078004518913D 最后, double=近似值 十进制我通常考虑自然量和人工量 自然量是指体重、身高和时间。这些永远不会被绝对准确地测量,也很少有绝对准确的算术概念:你通常不应该把高度加起来,然后确保结果完全符合预期。对于此类数量,请使用
double
。双打的射程很大,但精确度有限;它们也非常快
主要的人为数量是货币。有一种说法是“正好10.52美元”,如果你再加上48美分,你就可以得到正好11美元。对于此类数量,请使用decimal
。理由:考虑到一开始是人为的,所涉及的数字也是人为的,旨在满足人类的需求——这意味着它们自然地以10为基数来表达。使存储表示与人工表示匹配decimal
没有双精度的范围,但是大多数人工量也不需要这个额外的范围。它也比double慢,但我个人有一个银行账户,它给了我正确答案的速度比错误答案的速度慢:)
关于更多信息,我有关于和的文章。(请注意,
decimal
也是一种浮点类型,但所讨论的“点”是一个小数点,而不是一个二进制点。)SQL Server
还值得一提的是,SQL Server中的十进制映射到.net framework中的十进制和可为空的十进制。而sql server中的float映射为Double和可为null的Double。以防万一你最终会遇到一个数据库应用程序
Oracle
我不再使用oracle,因为您可以在我的个人资料信息中看到它被划掉了:),但是对于那些使用oracle的人,这里有一篇MSDN文章映射oracle数据类型:
定义“实际精度”。。。记住1米除以3的结果。你是说十进制是双精度的,就像双精度是浮动的吗?@Ian-他说用十进制表示货币,用双精度表示近似值,为什么人们要偷偷摸摸+1.fredou@Fredou:因此,在1/3的情况下,您仍然会丢失十进制的信息。再一次,你能定义一下“真正的精度”是什么意思吗?伊恩的评论很贴切-我已经知道double和decimal的行为,但是decimal给你“真正的精度”的想法对于任何直观的“真正的精度”都是误导性的。“它也比decimal慢,但我个人有一个银行帐户”我相信你想说“它也比double慢”:)+1,但是请详细解释一下,在使用oracle from.netsee时,这在oracle中是如何工作的。不过,这主要是关于植入细节,而不是“为什么”可能的复制