从MySQL中选择float以正确的精度

时间:2014-12-17 10:10:30

标签: php mysql

我搜索过的常见问题并且仍在阅读中。

我有一个交易表,交易价格被宣布为浮动。我不能'使用小数,因为不同的股票价格不同。

如果通过phpMyAdmin查看表格,所有数字看起来都是正确的 - 因为它们已经插入,如下面的截图所示,价格(p)是0.709这是正确的。

enter image description here

但是当我使用常规zend框架从表中选择该交易时,我得到的价格是 0.70899999141693

如何制作与MyAdmin select相同的选择?并以正确的精度接收数字? 如果myAdmin完成了这项工作,那么在zend也可以,我是对的吗?

编辑:我无法使用ROUND而我无法使用DECIMAL因为我不知道正确的精确度。 例如Apple的价格精确度为2位小数,但VTB Bank的价格精确度为6位小数

EDIT2:以下是myAdmin和zend中相同选择的更多示例。

Trade 8838397是由价格0.01156。我已将它插入数据库中,这就是我在myAdmin中得到的内容:

enter image description here

如果我用php选择它,我会得到这个:

enter image description here

我认为,myAdmin不知何故猜测精度并且确实很好。如何???

2 个答案:

答案 0 :(得分:1)

引用"我有一个交易表,交易价格被宣布为浮动。我不能'使用十进制,因为不同的股票在价格上有不同的精确度。"

我敢说这是胡说八道。如果您需要精确数据,请使用精确类型。如果值超出DECIMAL提供的范围,您将只使用float,这不是这里的情况。 DECIMAL(65,30)处理最多30个数字位置的值。对于你所有的价值观,这应该足够了,我想。

我想你在这里混合内部存储和数据显示。如果小数位数是所需信息,则存储此信息:

trade_id  office  price  precision
12345678  123456  0,709  4

查询:

select trade_id, office, round(price, precision) as price
from trades;

结果:

trade_id  office  price
12345678  123456  0,7090

编辑:至于" MyAdmin已经解决了它,我只是不知道如何":

它没有。我怀疑输入的0.120会显示0.120,输入的0.12000会显示0.12000。 dbms将为两者存储相同的浮点值,而phpMyAdmin无法告诉它们将被区别对待。 phpMyAdmin可能做的唯一事情是舍入到最大小数位数,比如6. select round( 0.70899999141693 , 6)得到0.709。

答案 1 :(得分:0)

您可以使用round功能:

select round(p, 3) as p from table_name;