tidb有四舍五入六成双的修约函数吗?或者有没有实现方式呢

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 场景 + 问题概述
我需要用到银行家算法的四舍五入六成双修约规则,但是tidb不支持自定义函数,怎么实现呢?

【应用框架及开发适配业务逻辑】

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

【附件】 相关日志及监控

说错了吧,应该是 四舍六入五成双

没有听说过

没有,是说这个(Banker’s rounding)的修约函数吧。
可以通过自定义函数(UDF)来实现这个功能。

没听说过

是的,有好的办法吗

自定义函数不支持…吧|_|

估计只能放到应用层去实现了。

理论上多个函数嵌套应该能搞出来

在EXCEL中,通过单元格内键入复合公式“=IF (A1)-INT(A1))<>0.5,ROUND(A1),0),IF(MOD(INT(A1)),2)=0,INT(A1),ROUND((A1),0))实现对A1单元格输入值判断正负并分别进行个位四舍六入五成双取整运算。

这个规则在代码里应该有共通方法吧

应该是可以通过数据库内置函数嵌套能算出来,毕竟数据库可以case when

感觉这个不应该放在数据库层面实现。

https://dev.mysql.com/doc/refman/8.0/en/precision-math-rounding.html
即便是mysql,都有这么一句提示.

* For approximate-value numbers, the result depends on the C library. On many systems, this means that [ROUND()](https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_round) uses the “round to nearest even” rule: A value with a fractional part exactly half way between two integers is rounded to the nearest even integer.

round的类型根据计算,有一部分是依赖c 库实现的。这可能会在不同平台上造成不同的表现。文档链接里面有例子。

如果数据类型,c库,这些乱七八糟的问题都会导致结果不稳定,怎么看都是应用层来实现会比较好。

特殊业务最好代码实现,数据库容易出问题。

放业务代码里面实现吧

mysql数据库的舍入模式,decimal是四舍五入,float和 double是四舍六入五成双
四舍,小于等于四舍去,
六入,大于等于六则加一
五成双,是五的话看前一位是双数还是单数,单则加一,双的则看5后面的大于0则进位,等于0则舍去

2 个赞

第一次听说,学些了。

代码层面去实现吧

TiDB虽然不支持自定义函数,但您可以通过以下方法实现银行家算法的四舍五入六成双修约规则:

  1. 使用内置函数:TiDB 提供了一些内置函数可以实现常见的数值运算和修约操作。您可以尝试使用 ROUND() 函数进行四舍五入操作。例如,ROUND(123.456, 2) 将返回 123.46。

  2. 使用表达式和条件判断:如果内置函数无法满足您的需求,您可以使用表达式和条件判断来实现银行家算法的修约规则。例如,通过判断小数部分的位数和后一位的值,来决定是否进行修约。

以下是一个示例 SQL 查询,使用表达式和条件判断来实现银行家算法的修约规则:
SELECT
CASE
WHEN ABS(value * 10 - FLOOR(value * 10)) = 0.5 AND FLOOR(value) % 2 = 0 THEN FLOOR(value)
ELSE ROUND(value, 2)
END AS rounded_value
FROM your_table;
在这个示例中,我们判断小数部分乘以 10 的结果是否为 0.5,同时判断整数部分是否为偶数,来决定是否进行修约。如果满足条件,则使用 FLOOR() 函数取整;否则,使用 ROUND() 函数进行四舍五入。

https://docs.pingcap.com/zh/tidb/stable/precision-math

:+1:‍ 这段文档很久之前,v2的时候就存在了