刚刚发现这个查询:
SELECT 1 / 1000000;
将返回0
,这对于我们在进行增值税计算时的经济计划来说是一场小灾难。如何设置默认小数位数而不更改每个查询?
编辑
手头的例子是从净值中获取增值税部分,增值税率为6%。6 / 106 = 0.056603773...
,但是SELECT 6 / 106 = 0.0566
。
/
时,结果的比例是第一个操作数的比例加上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));
您可以将结果转换为任何数据类型。以下SQL将结果转换为精度为10的十进制数。
select cast(1 / 1000000 as decimal(10,10));
编辑: 结果取决于您的数据类型。请尝试以下操作:
SELECT 6.000000 / 106.000000;
如果您的数据是具有所需精度的十进制数,则您的结果将是具有足够精度的十进制数。因此,我认为您应该更新数据库中的日期类型。
尝试计算一万欧元销售的净增值税:
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上尝试过,看起来没问题。
numerator
是一个表达式,那么你别无选择,只能改变所有内容。如果它来自于表中的column
,那么请将列的数据类型更改为decimal(20,10)
或类似的类型。 - Ravinder Reddy