【问题标题】:Increase the precision of a formula's result in TSQL在 SQL 中增加公式结果的精度
【发布时间】:2016-04-04 21:31:30
【问题描述】:

我正在尝试将计算从 C# 迁移到 TSQL,但在达到所需的精度水平时遇到了一些困难。插入了一些有问题的变量的公式示例如下:

( 6.4 + ( 10 - 6.4 ) * 0.5 ) * 0.75

当我在 C# 中执行此操作时,我得到了结果 6.1499999999999995。 但是,如果我在 TSQL 中选择它,它会四舍五入为 6.1500

有什么方法可以在 TSQL 中实现更高级别的精度?

【问题讨论】:

  • 我认为SQL Server的回答是正确的。
  • 我很高兴承认这一点。问题是我正在实现的计算需要 C# 样式的结果。
  • 您在 C# 中的数据类型是什么?如果您在 C# 中使用浮点类型,则它不准确。始终使用小数。顺便说一句,您的陈述中没有除号 (/),为什么您认为 6.149999999 是正确的?!
  • 我不认为我瞄准的数字更准确。但是,我确实需要获得该数字,因为我试图重现的算法假定了 c#/javascript 样式的不准确性。也许有一天,我将在事件响应和安全团队论坛上获得足够的吸引力,从而提出更好的路径。但在那之前,我一直在寻找一种让 sql 在这种情况下表现得更像 c#/javascript 的方法。

标签: c# sql sql-server tsql


【解决方案1】:

你可以做一个

CAST(X AS DECIMAL(y,s))

其中 X 是列,y 是精度。 38 是您可以使用的最大压力。 s 是小数点右边的值的个数。

https://msdn.microsoft.com/en-us/library/ms187746(v=sql.120).aspx

【讨论】:

  • 感谢您的建议。你知道我如何使用它来获得我正在寻找的结果吗?我尝试将每个单独的变量转换为小数,但没有奏效。更简单的方法SELECT CAST((( 6.4 + ( 10 - 6.4 ) * 0.5 ) * 0.75) AS DECIMAL(38, 37)) 也没有
  • 我无法测试 atm,但我只是在答案中添加了第二个参数,它定义了小数点右侧的值的数量。你可以尝试用你想要的一些 s 值来转换第一个值吗?我想这应该使整个语句成为小数。
  • 我尝试使用添加了第二个变量的整个公式进行转换 (DECIMAL(38,37)。当您说“您可以尝试转换第一个值”时,您的意思是 6.4 吗?
  • 是的,我就是这个意思。但是,只是在纸上进行计算:6.15 实际上应该是更精确的结果,不是吗?
  • 您可以尝试在 C# 代码中使用 Decimal 类型,代码中的文字只需使用 6.4m 而不是 6.4。
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多