将字符串转换为float而不会丢失精度

时间:2015-12-17 02:42:44

标签: php

var_dump((float)'79.10')返回79.09999999999999。我已经尝试了一百万种尝试将这个值作为浮点数(number_formatround)将原始值79.10舍入到原始值79.10,而我无法找到方法来执行此操作。

我有什么方法可以从原始字符串中获得79.10的float值吗?

3 个答案:

答案 0 :(得分:5)

不,因为0.1(并且,扩展名为79.1)实际上不能表示为float(假设是IEEE-754单精度或双精度编码)。该编码中的0.1具有无限重复的小数部分:

1001 1001 1001 1001 ...

您要么必须将其保留为字符串,要么接受编码方案没有无限精度并解决它的事实。

后者的一个例子是仅将数字输出到某个精度,例如两位小数,并确保(in-)相等比较使用绝对或相对增量来比较数字。

当您添加数字时,需要进行一些操作才能使不精确效果在百分之一级别变为可见。乘法时速度更快但仍需要一段时间。

答案 1 :(得分:2)

虽然paxdiablo是正确的并且使用浮点数没有无限精度,但我发现通过首先调整PHP的精度设置确实可以将79.10表示为浮点数:

ini_set('precision', 15);

之后,var_dump((float)'79.10')正确返回79.1的浮点数。每个人在自己的机器上看到的不同结果似乎是每个人默认设置不同精度值的结果。

答案 2 :(得分:1)

这不可能作为float,因为它没有提供足够的精确度(有关更多信息,请参阅here

现在,在大多数语言中,您可以将其转换为double ...不幸的是,在PHP中,floatdouble使用完全相同的基础数据类型,以便获得你想要的价值,你将不得不重新编译PHP。

您最好的选择是使用PHP BCMath模块之类的任意精度。