MySQL, 将默认的四舍五入改为四位以上

4

刚刚发现这个查询:

SELECT 1 / 1000000;

将返回0,这对于我们在进行增值税计算时的经济计划来说是一场小灾难。如何设置默认小数位数而不更改每个查询?

编辑

手头的例子是从净值中获取增值税部分,增值税率为6%。6 / 106 = 0.056603773...,但是SELECT 6 / 106 = 0.0566


我更喜欢一种方法,而不必改变代码库中的每一个经济查询。如果numerator是一个表达式,那么你别无选择,只能改变所有内容。如果它来自于表中的column,那么请将列的数据类型更改为decimal(20,10)或类似的类型。 - Ravinder Reddy
3个回答

2
算术运算符文档中所述:
在使用两个精确值操作数进行除法运算/时,结果的比例是第一个操作数的比例加上div_precision_increment系统变量的值(默认为4)。例如,表达式5.05 / 0.014的结果具有六位小数的比例(360.714286)。
因此,要么:
  • Increase div_precision_increment to suit your needs:

    SET div_precision_increment = 6;
    

    Or, to set globally (i.e. across all future sessions):

    SET GLOBAL div_precision_increment = 6;
    

    Or even set it in the [mysqld] section of your option file / on the command-line to ensure that it survives server restarts.

  • Explicitly cast the result of your operation to a type having your desired scale:

    SELECT CAST(1 / 1000000 AS DECIMAL(10,8));
    

1

您可以将结果转换为任何数据类型。以下SQL将结果转换为精度为10的十进制数。

select cast(1 / 1000000 as decimal(10,10));

编辑: 结果取决于您的数据类型。请尝试以下操作:

SELECT 6.000000 / 106.000000;

如果您的数据是具有所需精度的十进制数,则您的结果将是具有足够精度的十进制数。因此,我认为您应该更新数据库中的日期类型。


很好,但我更喜欢一种不需要更改代码库中每个经济查询的方法:P - Olle Härstedt

1

尝试计算一万欧元销售的净增值税:

SELECT 10000 * (6/106)

我相信你会看到正确的计算结果:566.0377

如果你想将其显示为两位小数,即以美分为单位,请执行以下操作:

SELECT ROUND(10000*(6/106),2)

你可能希望将你的货币(金钱)数据类型表示为DECIMAL。例如,一个产品单价可以表示为

  DECIMAL(10,2) 

允许美元/英镑/欧元和百分之一。

然后你的算术运算不应该失去精度。例如,

 SELECT 24*(6/106)*CAST(1.20 AS DECIMAL(10,2))

将产生6%的净增值税,适用于两打每个1.20美元的物品。

为了避免大量查询而实现此目标,您可能需要更改某些列的定义。

我已在MariaDB 10、MySQL 5.1、5.5和5.6上尝试过,看起来没问题。


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