开发者社区> 问答> 正文

perl dbi mysql-值精度

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;

展开
收起
祖安文状元 2020-01-08 15:05:56 448 0
1 条回答
写回答
取消 提交回答
  • 由于创建列的方式,您看到的舍入正在发生。

    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中的输出格式(您可以通过两种方式进行操作):

    2020-01-08 15:06:03
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像