在 PHP 中打印双精度值的真实值?



我有一个双$measure,对于我的'歌曲'中的每个节拍,我都会添加另一个双打。 当$measure递增一个整数时,我想打印出这个新度量值。

似乎 PHP 想要对这些值进行四舍五入以使双精度对我来说看起来不错。 这是我得到的示例打印输出:

措施: 17 楼层: 16 四舍五入: 16

从代码:

echo "Measure: " . floatval($measure) . "Floor: " . floor($measure) . " Rounded: " . $roundMeasure . " ";

似乎$measure实际上包含 16.999999999 或一些类似的值。 有什么方法可以读取它的实际内容吗? 更好的是,有没有办法使用 PHP 的舍入系统,这样我就可以抓住 17 个? 谢谢。

更好的是,有没有办法使用 PHP 的舍入系统,这样我就可以抓住 17

通常你会使用定点算法,例如使用 64th,然后在输出中转换。

或者,您可以检查度量值是否增加了与其 floor(( 不同的值,小于 0.00001。

一般来说,你永远不应该依赖具有"精确"值的浮点值 - 很可能它不会。

作为权宜之计,您可以更改 php.ini 中的精度:

; The number of significant digits displayed in floating point numbers.
; http://php.net/precision
precision = 17

否则,您可以搬到BCMath:

对于任意精度的数学,PHP提供了二进制计算器,它支持任何大小和精度的数字,如果有足够的内存,以字符串表示,则高达2147483647(或0x7FFFFFFF(小数。

好问题。我以前不知道 php 中的这个错误/功能/问题。

这是我如何解决它的方法:

https://ideone.com/JgDDvo

echo "Measure: " 
. floor($measure).'.'
. sprintf("%04d",floor(($measure*10000)-floor($measure)*10000)) ."n";

您可以将 1000 更改为所需的任何精度。

请记住,这个技巧将适用于积极的价值观。 如果也可以具有负值,则需要对其进行调整。

最新更新