【问题标题】:How to store large float numbers as-is in mysql如何在mysql中按原样存储大浮点数
【发布时间】:2018-09-29 10:47:19
【问题描述】:

我有一个文件包含一些浮点数。它们是由 python 的 process_time() 函数产生的。这是我要存储在字段中的值的一个示例,

0.0034867459908127785

我需要按原样存储号码。然后我想查询该列的MAX。当我将值存储在FLOAT() 类型的列中时,它会四舍五入为:0.00348675。然后当我查询 MAX 时,我得到:0.0034867459908127785 这在我的情况下是不可接受的。我不希望对数字进行任何更改。

如何按原样存储这些大型浮点数?然后查询 MAX 并获取存储的确切数字?我不希望 MYSQL 舍入任何东西。我需要完整的数字。

【问题讨论】:

  • 你用的是哪个mysql版本?
  • 从您写的内容来看,该值似乎显示为“0.00348675”,但正在存储完整值。这是因为,如果存储的值为 0.00348675,则查询最大值将返回 0.00348675。如果该值不在存储值中,则它无法返回 0.0034867459908127785。很可能,当您显示存储值时,无论使用何种格式显示它都只显示“0.00348675”,即使存储值是 0.0034867459908127785(或接近它的值)。如果不是这种情况,您将必须更具体地说明如何获得这些结果。
  • 看看具有足够精度和规模的 MySQL DECIMAL 数据类型。
  • @Eric Postpischil 我将字段类型从FLOAT 更改为DECIMAL(65,30)。通过在右侧添加零,它似乎存储的时间比需要的长。所以我的号码变成:0.003486745990812778500000000000。最大值也返回这个数字。我似乎在做正确的事吗?如果是这样,我会将其发布为答案。
  • @Suresh 我正在使用版本5.7.23-0ubuntu0.18.04.1

标签: mysql database floating-point numbers decimal


【解决方案1】:
**First Approch:**

您可以将数据保存为十进制并获取最大值:

CREATE TABLE `save_processtime1` (
  `id` INT(11) NOT NULL,
  `point_decimal` DECIMAL(25,20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


INSERT INTO `save_processtime1` (`id`, `point_decimal`) VALUES('1','0.0034867459008127785');
INSERT INTO `save_processtime1` (`id`, `point_decimal`) VALUES('2','0.0034867459908127785');
INSERT INTO `save_processtime1` (`id`, `point_decimal`) VALUES('3','0.0034867459908127001');
INSERT INTO `save_processtime1` (`id`, `point_decimal`) VALUES('4','0.1000000021200021011');
INSERT INTO `save_processtime1` (`id`, `point_decimal`) VALUES('5','0.0032867459908127785');

mysql>SELECT MAX(point_decimal) FROM save_processtime;
+-----------------------+
| MAX(point_decimal)    |
+-----------------------+
| 0.1000000021200021011 |
+-----------------------+

其他方法:

您可以将此数据保存到字段为 VARCHAR 的表中。并简单地获得该领域的最大值。

虚拟表结构:

CREATE TABLE `save_processtime` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `point_num` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

insert into `save_processtime` (`id`, `point_num`) values('1','0.0034867459008127785');
insert into `save_processtime` (`id`, `point_num`) values('2','0.0034867459908127785');
insert into `save_processtime` (`id`, `point_num`) values('3','0.0034867459908127001');
insert into `save_processtime` (`id`, `point_num`) values('4','0.1000000021200021011');
insert into `save_processtime` (`id`, `point_num`) values('5','0.0032867459908127785');

最长输出时间:

mysql> SELECT MAX(point_num) FROM save_processtime;
+-----------------------+
| MAX(point_num)        |
+-----------------------+
| 0.1000000021200021011 |
+-----------------------+

希望这是你想要的!第一种方法比第二种方法好:)

【讨论】:

  • 我认为这不是一个好主意。我更喜欢将数字视为数字。
  • 是的,你是对的!但这是一种可以将十进制数字存储在 varchar 中的方法。
猜你喜欢
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
相关资源
最近更新 更多