user @ host:〜# mysql -V -mysql Ver 14.14 Distrib 5.7.25-28,用于debian-linux-gnu(x86_64),使用在debian-9,9下运行的7.0
user @ host:〜# uname -a -Linux 4.9.0-8-amd64#1 SMP Debian 4.9.144-3.1(2019-02-19)x86_64 GNU / Linux
用户@主机:〜# perl -MDBI -e 'print $DBI::VERSION ."\n";' -1.636
user @ host:〜# perl -v这是为x86_64-linux-gnu-thread-multi构建的perl 5,版本24,版本1(v5.24.1)
mysql> SHOW CREATE TABLE tbl1;
tbl1 | 创建表`tbl1`(
`id` bigint(20)NOT NULL AUTO_INCREMENT,
main_id bigint(20)NOT NULL DEFAULT'0',
`debet` varchar(255)NOT NULL DEFAULT``,
`kurs` double(20,4)NOT NULL默认'0.0000',
sum sum double(20,2)NOT NULL默认值'0.00',
is_sync` int(11)NOT NULL默认为'0',
主键(`id`),
KEY`main_id`(`main_id`)
)ENGINE = InnoDB AUTO_INCREMENT = 70013000018275 DEFAULT CHARSET = utf8
mysql> SELECT * FROM tbl1 WHERE id=70003020040132;
由于创建列的方式,您看到的舍入正在发生。
kurs
double(20,4) NOT NULL DEFAULT '0.0000' summ
double(20,2) NOT NULL DEFAULT '0.00' 如果查看mysql浮点类型文档,将会看到您正在使用非标准语法double(m, d),其中两个参数定义了浮点数的输出方式。
因此,在您的情况下,存储在其中的值summ将在该点后面显示2位数字。这意味着,当perl从数据库中的表中获取一个值为1.0001时,数据库所提供的perl所获取的值将四舍五入为设置的位数(在这种情况下为.00)。
Perl依次将此值(“ 1.00”)解释为浮点数,并且在打印时不会显示任何尾随零。如果需要这些,则应在输出中容纳此内容。
例如: print sprintf("%.2f\n", $summ);
从我的角度来看,您有两种方法可以使用(如果要避免这种精度损失):
仅将具有正确精度的数字添加到数据库中(因此,'summ'仅用于两个尾随数字,而用于则用于四个'kurs')。 将表创建更改为浮点数的标准语法,并确定Perl中的输出格式(您可以通过两种方式进行操作):
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。