【问题标题】:Replacing comma with dot rounds the value and removes decimals [closed]用点替换逗号会舍入值并删除小数[关闭]
【发布时间】:2021-03-23 09:11:38
【问题描述】:

我正在尝试将逗号 (,) 与点 (.) 更改为一行中的值,但这样做时,该值仅使用两位小数进行四舍五入。

所以[LineAmount]的值正常返回,例如:“1389,344

但是在执行REPLACE([LineAmount], ',', '.') 时,值会变为“1389.34

只有当值有 3 位小数时才会发生这种情况,即 2 或 1,REPLACE 正确完成。

我错过了什么?我尝试在 REPLACE 之前将值转换为 varchar 或十进制,但同样的情况发生了。

我只需要把逗号换一个点,别的什么都没有。

提前谢谢你。

【问题讨论】:

  • 发送完整的minimal reproducible example。我无法复制你的问题。 db<>fiddle。然而,似乎真正的问题是您将数字数据存储为字符串。
  • 列数据类型?
  • @jarlh 有效问题。猜测列的数据类型是小数(x,2)。
  • "猜测列的数据类型是小数(x,2)" 如果是,@Dr.Casual,它永远不会有值'1389,344'
  • float 值没有逗号;这是你的第一个问题。 REPLACE({FloatValue},',','.') 不会做任何事情(有意义)。接下来,float 是一种不精确的数据类型,因此您实际上已经表示您对使用该类型的数据丢失感到满意。 2节课; 1 数字数据类型没有格式,因此您不能用句点替换逗号。 2. 如果您想要精确的值并且不想想要遇到这样的舍入问题,请不要使用float

标签: sql sql-server sql-server-2016


【解决方案1】:

真正的问题有2个:

  1. 你认为数值数据类型有格式数据;他们没有。
  2. 您使用的是浮点数据类型,然后当它失去精度时会“心烦意乱”,尽管当您将值定义为 float 时,您说您对这种行为感到满意。

因此,解决方案很简单,使用decimal/numeric 数据类型来存储您的数据,因此不会遇到舍入问题。然后,如果您需要对值进行格式化,请在表示层中进行,而不是 RDBMS。 REPLACE({Numerical Data Type},',','.') 不会做任何有意义的事情,因为数值数据类型 不是 字符串;他们不像他们那样工作。

如何在表示层中实现格式设置是一个完全不同的问题,因为这取决于您用于构建所述表示层的工具。

【讨论】:

  • 问题是这个数据库真的太老了,不是我设置的,所以数据类型flotat现在不能改变。这就是为什么我一直在寻找解决方法或解决方案来实现它。如果 SQL Server 不能为我做到这一点,我会尝试按照你说的在表示层中使用。
  • 这并没有改变我的答案,@Nanaki。第 1 点仍然有效,数值数据没有格式,因此替换逗号没有意义;它没有。
  • 也许我只是不明白,因为我不是 SQL 专家,但是将其更改为字符串也会删除值,这是为什么呢? 24859,296 > float / 24859.3 > nvarchar
  • 欢迎使用不精确的数据类型,@Nanaki。同样,“当您将值定义为 float 时,您表示您对这种行为感到满意。”
猜你喜欢
  • 2012-12-14
  • 2021-11-06
  • 2019-06-06
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多