【问题标题】:how to limit numbers in json object to 2 digits after the decimal point如何将json对象中的数字限制为小数点后2位
【发布时间】:2021-10-11 11:08:23
【问题描述】:

我正在尝试将表单中的数据存储在 .json 文件中。输入值是字符串,我将它们转换为数字:

$pooldata = [];
$pooldata['Free chlorine'] = floatval(round($_POST['fcl'], 3));
$pooldata['Total chlorine'] = floatval(round($_POST['tcl'], 3));
$pooldata['Combined chlorine'] = floatval( round($_POST['tcl'], 3) - round($_POST['fcl'], 3) );

$id = 'id_'.$pooldata['Date'];
$poolfile = 'data/'.$id.'.json';
$jsonData = json_encode($pooldata, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
file_put_contents($poolfile, $jsonData);

echo $pooldata['Free chlorine'].'<br />';
echo $pooldata['Total chlorine'].'<br />';
echo $pooldata['Combined chlorine'].'<br />';

回声给了我这个输出

1.65 // free chlorine
1.85 // total chlorine
0.2 // combined chlorine (= total chlorine - free chlorine)

但我的 json 看起来像这样:

{
    "Free chlorine": 1.6499999999999999,
    "Total chlorine": 1.8500000000000001,
    "Combined chlorine": 0.20000000000000018
}

应该是这样的:

{
    "Free chlorine": 1.65,
    "Total chlorine": 1.85,
    "Combined chlorine": 0.2
}

我做错了什么?

【问题讨论】:

  • round() 之后,某些东西已经是一个数字,所以floatval() 毫无用处。请注意,round() 可以帮助您选择舍入类型。对于所有意图和目的,1.6499999999999999 等同于1.65。为什么要后者?

标签: php json input decimal


【解决方案1】:

这看起来是serialize_precision int 的问题:Documentation 这是在服务器上确定的

ini_set("precision", 14); 
ini_set("serialize_precision", -1);

$pooldata = [];
$pooldata['Free chlorine'] = floatval($_POST['fcl']);
$pooldata['Total chlorine'] = floatval($_POST['tcl']);
$pooldata['Combined chlorine'] = floatval($_POST['tcl'] - $_POST['fcl'])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 2023-04-02
    相关资源
    最近更新 更多