PHP和MySQL中的浮点精度问题,用于存储偶然的十进制值

时间:2015-05-09 07:36:04

标签: php mysql floating-point floating-point-precision decimal-point

我想在MySQL数据库中存储偶尔的十进制值,并在我的PHP应用程序中显示它们。让我解释一下,偶尔的十进制值是什么意思。数字在大多数时间都是整数,就像一个整数。例如,160或170等。但有时我需要保存像98.6这样的值。

首先我在数据库中使用了DECIMAL(4,1)数据类型,我发现我总是得到这样的数字:160.0,170.0和98.6等。所以,我把它改为FLOAT。在我的本地环境中,我在PHP应用程序和phpMyAdmin上看到数字为160,170,98.6等。但在我的生产环境中,我在phpMyAdmin上看到了160,170,98.6等数字。但在PHP应用程序上,我看到的数字如160,170,98.599998474121等。

现在我需要决定是切换回decimal还是继续使用float。无论哪种方式,我都需要找到一个解决方案,将数字转换为如下格式:160,170和98.6等。

您认为为此目的更好:decimalfloat?如果数字的小数部分为零(使用decimal时),将数字转换为整数的最佳方法是什么?将浮点值(如98.599998474121)转换为98.6的最佳方法是什么?

如果数字的小数部分为零,则将数字转换为整数:

<?php
if (fmod($number, 1) == 0) {
    $number = intval($number)
}

还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我也遇到过这个错误。 (阅读此http://www.leaseweblabs.com/2013/06/the-php-floating-point-precision-is-wrong-by-default/

这是与php相关的错误。

如果您确定您的小数部分最多只有一位数而您遇到更多数字,则表示您需要重新处理该数字

您可以获得如此精确度:

function precision($num) { 
   return strlen(substr($num, strpos($num, '.')+1)); 
}