繁体   English   中英

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

[英]Floating point precision issue in PHP and MySQL for storing occasional decimal values

我想将偶数十进制值存储在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)
}

有什么更好的办法吗?

了解float不是精确的十进制数字,而是与其接近的值。 它的存储方式非常有效,但代价是不够精确。 在不知道您的确切需求的情况下,一种可能的解决方案是将数字存储为浮点数并将其四舍五入到小数点后一位。

// the casts are there just for the demonstration, you probably don't need them
$number = "170";
echo round((float)$number, 1); // gives 170
$number = "98.6";
echo round((float)$number, 1); // gives 98.6

浮点数以您想要的方式表示整数,并且仅当您存储某些小数时,它们才会失去精度。

我也遇到了这个错误。 (请阅读此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)); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM