【问题标题】:How to round decimals smaller than .5 to the following number in SQL?如何在 SQL 中将小于 0.5 的小数舍入为以下数字?
【发布时间】:2022-08-04 07:50:17
【问题描述】:

我遇到这种情况,我有一个包含 +1000 个产品的大型数据库。

例如,其中一些价格为 12.3、20.7、55.1。

| Name     | Price          |
| -------- | -------------- |
| Product 1| 12.3           |
| Product 2| 20.7           |
| Product 3| 55.1           |

(等等)...

我试过的是update prices set price = ROUND (price, 0.1)。 输出将是:

| Name     | Price          |
| -------- | -------------- | (after updated)
| Product 1| 12.3           | 12.0
| Product 2| 20.7           | 21.0
| Product 3| 55.1           | 55.0

小数点 < .5 的价格将保持不变,我没有想法。

我将不胜感激。

注意我需要更新所有行,我正在尝试了解CEILING(),但只展示了如何将它与SELECT 一起使用,关于如何执行UPDATE CEILING 或其他什么的任何想法?

  • 如果你想四舍五入,你通常会使用CEILING()。所以也许像SELECT CEILING(price) 这样的东西,虽然你只是给出了一个你不想要的输出的例子,但是看看你想要的输出会很有用
  • 为这个问题所涉及的情况添加一些数据示例。
  • ROUND 的第二个参数应该是一个整数。
  • 你要么想要FLOOR(总是向下取整)、CEILING(总是向上取整)或ROUND(四舍五入到距零最近的整数)。你想要哪个,我们不知道。
  • 如果您只是想四舍五入到最接近的整数单位,您可以使用 Round(price, 0) 表示您不想要任何小数位。

标签: sql sql-server tsql


【解决方案1】:

不完全清楚你在问什么,但我可以告诉你所示的函数调用没有意义。

the ROUND() function 的第二个参数是小数位数,而不是您希望四舍五入的值的大小。此外,该函数仅接受该参数的整数类型。因此,如果您将值 0.1 传递给函数,将会发生的情况是值是第一个转换为整数,而将0.1 转换为整数的结果是0

然后我们看到,调用ROUND(price, 0.1) 与调用ROUND(price, 0) 相同。

如果要四舍五入到最接近的0.1,则为小数点后一位,ROUND() 函数的正确值为1

ROUND(price, 1)

在此处比较结果:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=7878c275f0f9ea86f07770e107bc1274

注意后面的 0 仍然存在,因为值的基本类型没有改变。如果您还想删除尾随的 0,那么您真的进入了字符串领域,为此您应该等待客户端代码、应用程序或报告工具处理转换。

【讨论】:

  • 嗨,看看你展示的示例网站,产品 1 的价格为 12.300,我需要它是 13,我知道如何解释自己,因为我拥有这家商店,但我不熟悉高级编码,但从什么我知道小数点低于 0.5 的价格根本不会四舍五入,也许我的查询是错误的,但我不知道如何解决这个问题,我希望例如 12.1 为 13.0 或 10.4 为 11,也许我是专注于错误的函数,更数学的东西,比如将 0.5 以下的小数至少设为 0.6,然后执行 ROUND()?
  • @RoyGivenchi 在这种情况下,请使用 CEILING() 而不是 ROUND(),如一些早期的 cmets 所示。
【解决方案2】:

使用 UPDATE prices SET PRICE = CEILING(PRICE); 获取小数 >0.5 的值的下一个整数

【讨论】:

  • 但这不会更新我所有的行,对吧?我需要执行更新,这只会给我视觉结果,对吗?
  • 我到处找这个,非常感谢
  • 这会将所有值四舍五入到下一个整数。它不做“四舍五入”。 @JoelCoehoorn 的答案是正确的答案。
猜你喜欢
  • 2022-07-27
  • 1970-01-01
  • 2021-04-17
  • 2021-07-07
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多