在sql server中,数据从一个表移动到另一个表时,精度会提高
sql server 2008中有三个表在sql server中,数据从一个表移动到另一个表时,精度会提高,sql,sql-server-2008,precision,Sql,Sql Server 2008,Precision,sql server 2008中有三个表 处理订单 办理装运 处理子订单 其中三个有一个公共列账面成本。所有三个表中的数据类型都相同。它是浮点型,具有数字精度53和数字精度基数2 在表1-transact_orders中,该列三行的值为5.1。转换(十进制(20,15),携带成本)返回5.100000。。。。。在这里 表2-transact\u装运三行从transact\u订单中的这三行获取账面成本。 转换(十进制(20,15),携带成本)返回5.100000。。。。。这里也是 表3-trans
5.100000
。。。。。在这里5.100000
。。。。。这里也是15.3
convert(十进制(20,15),携带成本)
在此稳定状态下返回15.29999999999
。结果表明,精度在ui中也获得了
值。尽管ui只是获取值,而没有进行任何转换。在java代码中,从db中获取值的变量定义为double
第3步中总结三项账面成本的代码很简单:
…sum(isnull(transact\u shippings.carrieng\u costs,0))sum\u carrieng\u costs,
你知道为什么在第三步会发生这种变化吗?任何帮助都将不胜感激。如果需要更多信息,请告诉我。我将写一个答案,而不是发表一堆评论
浮动不适用于不能接受舍入误差的精确值,例如,财务 浮动可以从非常小的数字扩展到非常高的数字。但他们这样做的同时也会失去一定的准确性。你可以在网上查到细节,有很多好的作品供你阅读 但是,简单地说,这是因为它们是真正的二进制数——有些十进制数不能100%准确地表示为二进制值。(就像1/3不能以100%的精度用十进制表示一样。)
我不确定是什么导致DECIMAL数据类型出现性能问题,通常是因为存在一些隐式转换。(你有一个浮点数,或者有不同定义的小数,等等) 但不管原因是什么;没有什么比整数运算更快的了。那么,你的值是整数吗<代码>1.10可以存储为
110p
。或者,如果你知道你会因为某种原因得到一便士的分数,11000dp
(分币)
您需要考虑您将达到的最大值,以及<代码> int <代码>或<代码> Bigint < /C> >更合适。
此外,在处理整数时,请注意除法。如果你在3个人之间分配10英镑,那么最后一个1p
需要去哪里<两个人的代码>3.33英镑,一个人的代码>3.34英镑<代码>0.01英镑被银行吃掉了?但是,它不应该总是输给数字精灵
显然,当向用户显示数字时,您需要将其返回到
,而不是dp
;但无论如何,你都需要经常这样做,才能拿到10万英镑或10万英镑,等等
无论您做什么,如果您不希望由于浮点值而产生舍入错误,请不要使用FLOAT
(网上有很多关于如何使用浮点数的文章,更重要的是,如何不使用浮点数。这是一个大话题;只是不要落入“它太准确了,太神奇了,它可以做任何事情”的陷阱——我无法统计人们使用这种不幸的常见但幼稚的假设破坏数据的次数。)我将写一个答案,而不是发表一堆评论
浮动不适用于不能接受舍入误差的精确值,例如,财务 浮动可以从非常小的数字扩展到非常高的数字。但他们这样做的同时也会失去一定的准确性。你可以在网上查到细节,有很多好的作品供你阅读 但是,简单地说,这是因为它们是真正的二进制数——有些十进制数不能100%准确地表示为二进制值。(就像1/3不能以100%的精度用十进制表示一样。)
我不确定是什么导致DECIMAL数据类型出现性能问题,通常是因为存在一些隐式转换。(你有一个浮点数,或者有不同定义的小数,等等) 但不管原因是什么;没有什么比整数运算更快的了。那么,你的值是整数吗<代码>1.10可以存储为
110p
。或者,如果你知道你会因为某种原因得到一便士的分数,11000dp
(分币)
您需要考虑您将达到的最大值,以及<代码> int <代码>或<代码> Bigint < /C> >更合适。
此外,在处理整数时,请注意除法。如果你在3个人之间分配10英镑,那么最后一个1p
需要去哪里<两个人的代码>3.33英镑,一个人的代码>3.34英镑<代码>0.01英镑被银行吃掉了?但是,它不应该总是输给数字精灵
显然,当向用户显示数字时,您需要将其返回到
,而不是dp
;但无论如何,你都需要经常这样做,才能拿到10万英镑或10万英镑,等等
无论您做什么,如果您不希望由于浮点值而产生舍入错误,请执行以下操作