简单地说:我将使用“.Net”一词来指一个只有7个有效数字的SQL和一个SQL。我将使用" double“一词来指带有15个有效数字的.Net双和SQL。我也意识到这和其他一些关于小数/双数的帖子很相似,但是这些帖子的答案是不一致的,我真的很想对我的具体情况提出一些建议.
我是一个正在重写旧应用程序的团队的成员。最初的应用程序使用了浮点数(7位数)。这当然引起了问题,因为应用程序进行了大量的计算和舍入错误积累非常快。在某种程度上,这些浮子中的很多都变成了小数。后来,数据库中的浮点数(7)都变成了双倍(15)。在那之后,我们还有几个关于双倍计算的错误,它们也被修改为小数。
今天,我们数据库中所有浮点数的1/3是小数,其余的是双倍。我的团队希望“标准化”数据库中的所有浮点数(和新的.Net代码),以便使用专小数或双小数,除非必须使用另一个浮点数。团队中的大多数人都致力于使用小数;我是我的团队中唯一主张使用双小数而不是小数的人。这就是为什么。
我的队友们认为:
我坚信,由于浮点数而引起的原始问题只有7个有效位数,而简单的算术(例如10001 * 10001)使它们快速地使用了它们所拥有的几个重要数字。我不认为这与二进制浮点数只能近似十进制值有任何关系,我相信使用双数可以解决这个问题。
我认为出现双倍的问题是因为在计算数据类型之间来回转换值时,双数是沿着小数使用的。许多这样的计算都会在中间步骤之间进行计算!
我试着说服我的团队不要把太阳底下的一切都变成十进制。无论如何,数据库中的大多数值不会超过5或6个有效位数。不幸的是,我被我团队的其他成员淘汰了,他们对事情的看法非常不同。
那么我的问题是..。
发布于 2016-04-13 04:45:33
当你需要完美的准确性时使用decimal作为一个基数-10(财务数据,等级)
当您存储自然不精确的数据(测量、温度)时,使用double或float,需要更快的数学运算,并且可以牺牲一分钟的不精确性。
由于您似乎只存储各种度量(这些度量具有一定的精度),因此float将是合理的选择(如果您需要超过7位的精度,则为double )。
使用小数实际上解决了双倍不能解决的问题吗?
不完全是--数据只会像用于生成数据的测量那样精确。你真的能说一个量是123.4567克吗?用于测量它的设备是否具有这种精度?
为了处理“四舍五入误差”,我认为你不能说1234.5克的测量值是否正好是一半
您需要决定的是“什么级别的精度是可以接受的”,并始终以该精度为最后一步。不要舍弃你的数据或中间计算。
如果使用双数更合适,那么我能提出哪些论点(除了我已经做的以外)可以说服我的团队不要把所有的东西都改变为小数?
除了花在切换上的时间外,你唯一真正牺牲的就是速度。要知道速度有多大,唯一的办法就是用这两种方法来测试速度和速度的差别。
发布于 2016-04-13 04:55:32
你最好尽你最大的努力避免失去精确性。我想我的错可能会说服你选择双倍。
我做了一些错误的算术,它返回了一些非常奇怪的东西:给定0.60**,的返回** 5
int get_index(double value) {
if (value < 0 || value > 1.00)
return -1;
return value / 0.10;
}我把它修好了
int get_index(double value) {
if (value < 0 || value > 1.00)
return -1;
return (value * 100000000) / (0.10 * 100000000);
}https://stackoverflow.com/questions/36588685
复制相似问题