首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用小数或双数

何时使用小数或双数
EN

Stack Overflow用户
提问于 2016-04-13 04:35:57
回答 2查看 1.5K关注 0票数 3

简单地说:我将使用“.Net”一词来指一个只有7个有效数字的SQL和一个SQL。我将使用" double“一词来指带有15个有效数字的.Net双和SQL。我也意识到这和其他一些关于小数/双数的帖子很相似,但是这些帖子的答案是不一致的,我真的很想对我的具体情况提出一些建议.

我是一个正在重写旧应用程序的团队的成员。最初的应用程序使用了浮点数(7位数)。这当然引起了问题,因为应用程序进行了大量的计算和舍入错误积累非常快。在某种程度上,这些浮子中的很多都变成了小数。后来,数据库中的浮点数(7)都变成了双倍(15)。在那之后,我们还有几个关于双倍计算的错误,它们也被修改为小数。

今天,我们数据库中所有浮点数的1/3是小数,其余的是双倍。我的团队希望“标准化”数据库中的所有浮点数(和新的.Net代码),以便使用专小数或双小数,除非必须使用另一个浮点数。团队中的大多数人都致力于使用小数;我是我的团队中唯一主张使用双小数而不是小数的人。这就是为什么。

  1. 数据库中的大多数数字仍然是双倍(尽管大部分应用程序代码仍然使用浮点数),如果将所有的浮点数/双数更改为小数,则需要付出更多的努力。
  2. 对于我们的应用程序,存储的字段中没有一个是“精确的”十进制数量。它们中没有一个是货币量,而且大多数代表某种“自然”的测量(例如质量、长度、体积等),因此双倍的16个重要数字已经比我们的初始测量精确得多。
  3. 许多表将度量存储在两列中:1用于值,1用于度量单位。这可能导致单个列中的值之间的比例上的巨大差异。例如,一列可以根据pCi/g或Ci/m3存储一个值(1 Ci = 1000000000000 pCi)。由于单个十进制列中的所有值都必须具有相同的标度(即.小数点前后分配的数字),我担心会出现溢出和舍入问题。

我的队友们认为:

  1. 双数不像小数那样精确,因为它们不能准确地表示1/10,而且它们只有16个重要数字。
  2. 即使我们没有跟踪资金,应用程序是一个库存系统,可以跟踪材料(主要是克量),它需要“尽可能准确”。
  3. 即使在浮标改为双打之后,我们的计算结果仍然很差。将这些列(和应用程序代码)更改为小数会导致这些计算产生预期的结果。

我坚信,由于浮点数而引起的原始问题只有7个有效位数,而简单的算术(例如10001 * 10001)使它们快速地使用了它们所拥有的几个重要数字。我不认为这与二进制浮点数只能近似十进制值有任何关系,我相信使用双数可以解决这个问题。

我认为出现双倍的问题是因为在计算数据类型之间来回转换值时,双数是沿着小数使用的。许多这样的计算都会在中间步骤之间进行计算!

我试着说服我的团队不要把太阳底下的一切都变成十进制。无论如何,数据库中的大多数值不会超过5或6个有效位数。不幸的是,我被我团队的其他成员淘汰了,他们对事情的看法非常不同。

那么我的问题是..。

  1. 我什么都不担心吗?在一个拥有近200个数据库表、数百个事务和5-6年重写计划的应用程序中,使用几乎完全的小数而不是双数会有什么真正的危害吗?
  2. 使用小数实际上解决了双倍不能解决的问题吗?从我的研究来看,小数和双数都容易受到任意分数(例如加法1/3 )的四舍五入误差的影响,解释这一点的唯一方法是,在比较双数和/或小数时,在一定公差内的任何值都是“相等”的。
  3. 如果使用双数更合适,那么我能提出哪些论点(除了我已经做的以外)可以说服我的团队不要把所有的东西都改变为小数?
EN

回答 2

Stack Overflow用户

发布于 2016-04-13 04:45:33

当你需要完美的准确性时使用decimal作为一个基数-10(财务数据,等级)

当您存储自然不精确的数据(测量、温度)时,使用doublefloat,需要更快的数学运算,并且可以牺牲一分钟的不精确性。

由于您似乎只存储各种度量(这些度量具有一定的精度),因此float将是合理的选择(如果您需要超过7位的精度,则为double )。

使用小数实际上解决了双倍不能解决的问题吗?

不完全是--数据只会像用于生成数据的测量那样精确。你真的能说一个量是123.4567克吗?用于测量它的设备是否具有这种精度?

为了处理“四舍五入误差”,我认为你不能说1234.5克的测量值是否正好是一半

您需要决定的是“什么级别的精度是可以接受的”,并始终以该精度为最后一步。不要舍弃你的数据或中间计算。

如果使用双数更合适,那么我能提出哪些论点(除了我已经做的以外)可以说服我的团队不要把所有的东西都改变为小数?

除了花在切换上的时间外,你唯一真正牺牲的就是速度。要知道速度有多大,唯一的办法就是用这两种方法来测试速度和速度的差别。

票数 1
EN

Stack Overflow用户

发布于 2016-04-13 04:55:32

你最好尽你最大的努力避免失去精确性。我想我的错可能会说服你选择双倍。

我做了一些错误的算术,它返回了一些非常奇怪的东西:给定0.60**,的返回** 5

代码语言:javascript
复制
int get_index(double value) {
    if (value < 0 || value > 1.00)
        return -1;
    return value / 0.10;
}

我把它修好了

代码语言:javascript
复制
int get_index(double value) {
    if (value < 0 || value > 1.00)
        return -1;
    return (value * 100000000) / (0.10 * 100000000);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36588685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档