Ksql中如何进行正确的四舍五入

单位用Bex5平台进行应用的快速开发,而该平台用的不是SQL,而是KSQL,因此存在和一般SQL不一样的函数限制。

另外,SQL中默认的Round函数也是四舍六入五成双,用一般的round函数,遇到比如1.050这种情况,2位Round的结果是1.05,也就是舍五不进位,不是我们想要的。

MySQL中可以通过Cast的方法,用数据类型转换成decimal并指明小数位数的方式来实现真正的四舍五入,但是KSQL中不能使用CAST函数。

考虑到CAST函数完成的作业本质是数据类型转换,因此尝试用Convert达成相同效果,结果成功。

sql.convert(1.050,sql.decimal(10,2))

如果是正常SQL的话,把上面的sql.去掉即可。

补充

最近又遇到个情况,让我对MySql的四舍五入有了更深刻的理解。
其实Round本身是没问题的,错就错在计算机内部的浮点误差。这种误差很可能是无法直接观察到的,特别是对于计算字段,最终存储在数据库的仍然是正常数字,但是四舍五入就是不进位(末尾为5,保留到原始点数-1的情况最可能出现。)
用相同的静态数字Round也是没有问题的,但结果相同的计算公式Round就是不进位。
之前说的Decimal对这种情况是有效的,但是如果遇到进位点数是变量的情况,Decimal内部再嵌套变量试下来是不行的,所以最终总结可行的解决方法。

方法一:Decimal

适用于进位要求为静态的简单情况。
例子:convert({your number or formular}.Decimal(10,6))

方法二:+(spot+1)*0.1

比如8位小数进到7位,进位前就加0.00000001

方法三:两次Round

注意Sql的round是从外到里的,比如8进7,这种情况的写法应该是round(round({your number or formular},7),8)
这里面的8和7都可以设置为变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日出拳老爷子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值