当数字大于1时,是否有充分的理由存储小于1的百分比?

Rex*_*ler 2 database numbers

我继承了一个使用SQL Server 200x的项目,其中存储一个始终被视为问题域中百分比的值的列存储为大于1的十进制等值.例如,70%(0.7,逐字地)被存储为70,100%作为100除了需要等记住*0.01上检索到的值和*100持续值之前,它似乎并不成为一个问题在其本身.它确实让我的脑袋爆炸 ......所以有一个很好的理由让我失踪吗?是否有令人信服的理由来解决它,因为有相当数量的代码编写与伪百分比一起使用?

有一些情况发生了大于100%,但我不明白为什么这个值不会仅仅存储为1.05,例如,在这些情况下.

编辑:头部感觉更好,更聪明.感谢您的所有见解.

P D*_*ddy 6

实际上有四个很好的理由我可以想到你可能想要存储 - 并计算整数百分比值而不是浮点数当量:

  1. 根据所选的数据类型,整数值可能占用较少的空间.
  2. 根据数据类型,浮点值可能会丢失精度(请记住,并非所有语言都具有与SQL Server类型等效的数据decimal类型).
  3. 如果该值将非常频繁地输入或输出给用户,则将其保持为更加用户友好的格式可能更方便(当您计算时显示和转换时转换之间的决定...但请参阅下一点).
  4. 如果原则值也是整数,那么

    principle * integerPercentage / 100
    
    Run Code Online (Sandbox Code Playgroud)

    它使用所有整数运算通常比它的浮点等价更快(在浮点类型相当于T-SQL 类型的情况下可能明显更快decimal).


And*_*ock 5

如果它是一个字节字段,那么它在数据库中占用的空间比浮点数少,但除非你有数百万条记录,否则几乎看不出差异.


S.L*_*ott 5

由于无法比较浮点值是否相等,因此可能使用整数来使 SQL 更简单。

例如

(0.3==3*.1)
Run Code Online (Sandbox Code Playgroud)

通常为 False。

然而

abs( 0.3 - 3*.1 )
Run Code Online (Sandbox Code Playgroud)

是一个很小的数字(5.55e-17)。但必须用(column-SomeValue) BETWEEN -0.0001 AND 0.0001or做所有事情是很痛苦的ABS(column-SomeValue) < 0.0001。您宁愿column = SomeValue在 WHERE 子句中执行此操作。