我改变了我的例子来使用 FLOAT ......太多人被整个 NVARCHAR 事情所困扰。我们没有将数字存储在数据库中作为 NVARCHAR。我只是以 NVARCHAR 为例。我用 FLOAT 得到了相同的结果。
对于某些 FLOAT,我们遇到了 SQL Server ROUND() 问题
声明@EXCHANGE_RATE FLOAT
设置@EXCHANGE_RATE = 1.327810000000000000000
选择回合(@EXCHANGE_RATE,6,1)
设置@EXCHANGE_RATE = 1.327820000000000000000
选择回合(@EXCHANGE_RATE,6,1)
第一个返回:1.327809 第二个返回:1.32782
您会认为第一个会返回 1.32781,而不是 1.327809。
这是 ROUND 中的功能还是错误?有什么简单的方法吗?
谢谢!
基于 Mat 将它们转换为 DECIMAL 的想法,这是有效的......它很难看,但有效。我使用 10 的原因是我查看了我们的数据库,这似乎是我们存储的最长的数字。另外我需要将它转换回 FLOAT 因为他们不想看到任何尾随的 0
声明@EXCHANGE_RATE FLOAT
设置@EXCHANGE_RATE = 1.327810000000000000000
SELECT CAST(ROUND(CAST(@EXCHANGE_RATE AS DECIMAL(28,10)),6,1) 作为浮动)
我暂时将下面的内容留在这里,这是事实,但这不是操作问题的原因。
正确的答案是 MatBailie 提供的,-nVarChar 字符串被转换为浮点数,然后截断操作将其减少到下一个较低的值......
来自 MSDN 的Round 函数
function
是要执行的操作的类型。函数必须是tinyint、smallint 或int。当 function 被省略或值为 0(默认)时,numeric_expression 会四舍五入。*当指定 0 以外的值时,numeric_expression 会被截断。*
试试这个,它显示了差异:
DECLARE @EXCHANGE_RATE NVARCHAR(200)
SET @EXCHANGE_RATE = '1.3278100'
SELECT ROUND(@EXCHANGE_RATE,6,0) Rounded,
ROUND(@EXCHANGE_RATE,6,1) Truncated
SET @EXCHANGE_RATE = '1.327810000001'
SELECT ROUND(@EXCHANGE_RATE,6,0) Rounded,
ROUND(@EXCHANGE_RATE,6,1) Truncated
Run Code Online (Sandbox Code Playgroud)
输出类型由输入决定...在本例中,输入为“1.3278100”,因此该值将转换为数字数据类型,其精度基于字符串中的有效位数(“1.3278100”具有5 位有效数字),因此输出类型被确定为数字(6,5)或类似的东西......这会导致意外的截断。这以前曾咬过我。
| 归档时间: |
|
| 查看次数: |
6386 次 |
| 最近记录: |