在sql server中,数据从一个表移动到另一个表时,精度会提高

在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

sql server 2008中有三个表

  • 处理订单
  • 办理装运
  • 处理子订单 其中三个有一个公共列账面成本。所有三个表中的数据类型都相同。它是浮点型,具有数字精度53和数字精度基数2

  • 在表1-transact_orders中,该列三行的值为5.1。转换(十进制(20,15),携带成本)返回
    5.100000
    。。。。。在这里

  • 表2-transact\u装运三行从transact\u订单中的这三行获取账面成本。 转换(十进制(20,15),携带成本)返回
    5.100000
    。。。。。这里也是

  • 表3-transact_子订单汇总了transact_装运的三项运输成本。当我运行正常选择时,显示的值是
    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万英镑,等等


    无论您做什么,如果您不希望由于浮点值而产生舍入错误,请执行以下操作