刚刚发现这个查询:
SELECT 1 / 1000000;
将返回0
,这对于我们在进行增值计算时的经济计划来说是一个小灾难。如何在不更改每个查询的情况下设置默认小数位数?
修改
手头的例子是从净值获得大桶部分,6%增值税。 6 / 106 = 0.056603773...
,但SELECT 6 / 106 = 0.0566
。
答案 0 :(得分:2)
正如Arithmetic Operators所述:
在使用
/
执行的除法中,使用两个精确值操作数时的结果比例是第一个操作数的比例加上div_precision_increment
系统变量的值(默认值为4) )。例如,表达式5.05 / 0.014
的结果具有六位小数(360.714286
)的比例。
因此,要么:
根据您的需要增加div_precision_increment
:
SET div_precision_increment = 6;
或者,要全局设置(即在所有未来的会话中):
SET GLOBAL div_precision_increment = 6;
甚至可以在命令行的选项文件的[mysqld]
部分设置它,以确保它能够在服务器重启后继续存在。
将操作结果显式地转换为具有所需比例的类型:
SELECT CAST(1 / 1000000 AS DECIMAL(10,8));
答案 1 :(得分:1)
您可以将结果转换为任何数据类型。在sql下面,将结果转换为十进制,精度为10。
select cast(1 / 1000000 as decimal(10,10));
修改强> 结果取决于您的数据类型。试试这个:
SELECT 6.000000 / 106.000000;
如果您的数据是必需精度的十进制数,那么您的结果将是十进制且具有足够的精度。所以我认为您应该更新数据库中的日期类型。
答案 2 :(得分: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))
将在24个项目上产生6%的净增值税,每个项目的成本为1.20。
为了实现这一目标,而不需要查看大量查询,您可能需要更改一些列'定义。
我在MariaDB 10,MySQL 5.1,5.5和5.6上试过这个。看起来很好。