将数字格式化为两位小数

200
我希望知道如何在不改变原始数值的情况下输出保留两位小数的数。
例如:
2229,999 -> 2229,99

我已经尝试过:

FORMAT(2229.999, 2)
CONVERT(2229.999, DECIMAL(4,2))

看起来你正在尝试使用命令进行截断。为什么不直接使用内置功能呢? - Fallenreaper
你不需要将小数点设置为 DECIMAL(6,2) 吗?其中 6 表示精度(即总位数),2 表示小数点后的位数。 - user5249203
6个回答

424

格式化数字到小数点后2位有两种选项:TRUNCATEROUND。你需要使用TRUNCATE函数。

示例:

不进行四舍五入:

TRUNCATE(0.166, 2)
-- will be evaluated to 0.16

TRUNCATE(0.164, 2)
-- will be evaluated to 0.16

文档:https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_truncate

带有四舍五入:

ROUND(0.166, 2)
-- will be evaluated to 0.17

ROUND(0.164, 2)
-- will be evaluated to 0.16

文档:https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_round


3
当您想要截断数字时,应使用“truncate”进行格式化。她在问题中已经非常明确地表明了这一点。有许多舍入方式(floor、ceiling、away-from-zero、toward-zero、half-up、half-down、half-even),它们适用于不同的情境。 - Kip
24
当然可以,但是我看到很多人觉得我的回答有用,或者当他们在寻找ROUND命令时发现了这个问题。所以我会保持原样不做修改。 - jmarceli
5
就像我之前所说的一样,我知道这不是这个问题的正确答案,但人们往往喜欢它 :) 可能是因为问题标题可能是某个正在寻找“ROUND”函数的人的搜索结果。 - jmarceli
那么你应该修复它。这样对每个人都有用,而且它将是100%正确的。双赢 :) - Benoit Duffez
这个舍入函数 ROUND 在处理货币数值时安全吗? - Renato Gama
显示剩余4条评论

91

10
截断始终“向下舍入”。 将1.999截断为2位小数将成为1.99,而2.00在数学上更正确。 如果这不是问题,则截断没问题,但您应该意识到这一点。 - GordonM
我同意GordonM的观点,使用TRUNCATE应该谨慎,特别是在处理浮点数时! - Nebulosar

22

2229.999转换成保留两位小数的十进制数,可以使用以下代码:CAST(2229.999 AS DECIMAL(6,2))


5
我认为你的意思是将2229.999转换为decimal(4,2)类型。 - Uncle Iroh
@UncleIroh,我认为他实际上是指 convert(2229.999 as decimal(4,2)) - Pacerier
3
@Pacerier - 两种方法从技术上都可以。但是使用convert方法时,格式应为:convert(2229.999, decimal(4,2)),其中使用了逗号,因此你可能是对的,这可能是他想要表达的意思。 - Uncle Iroh
@UncleIroh,啊,是的,我上面打错了。我说的是convert(2229.999, decimal(4,2)) - Pacerier
6
CAST(2229.999 AS DECIMAL(4,2))会给你99.99。DECIMAL是数字的最大位数,包括小数点左边的2位数字。CAST(2229.99 AS DECIMAL(6,2))会给你2230.00。 - russjohnson09

16

只需使用

format(number, qtyDecimals)
sample: format(1000, 2)
result 1000.00

根据你的所在地区,SELECT FORMAT(100000, 2); 的输出结果为:100,000.00。我相信这会破坏一个期望得到数字的应用程序。 - But those new buttons though..

2
这是我用它作为示例的方式:
CAST(vAvgMaterialUnitCost.`avgUnitCost` AS DECIMAL(11,2)) * woMaterials.`qtyUsed` AS materialCost

1

显示为十进制数 选择 ifnull(format(100.00, 1, 'en_US'), 0) 结果为 100.0

显示为百分数 选择 concat(ifnull(format(100.00, 0, 'en_US'), 0), '%') 结果为 100%


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接