【问题标题】:PHP: how to prevent json_encode rounding number automatically?PHP:如何防止 json_encode 自动舍入数字?
【发布时间】:2015-06-09 07:50:43
【问题描述】:

json_encode 有一个大问题,它会自动将数字四舍五入,但我需要在每个数字上保留 2 个小数点。

PHP:

<?php
$numbers = [1.00,2.00];

foreach ($numbers as $i => $number) 
{
      $numbers[$i] = number_format($number, 2, '.', null);
}

echo json_encode($numbers,  JSON_NUMERIC_CHECK);
?>

输出: [1,2]

预期输出: [1.00,2.00]

如何防止每个数字不自动四舍五入?

PS:不是字符串:)

【问题讨论】:

  • 去掉JSON_NUMERIC_CHECK参数即可。它会将您的格式化数字编码为字符串。
  • 整数只是一个数字。它没有特定的小数位数。您正在将整数格式化为可以具有您选择的任何布局的字符串,然后再次将生成的字符串专门编码为数字。你得到你要求的代码。如果您需要特定格式,请将数字作为格式化字符串传递
  • @sa.lva.ge 不,我不能,因为你在做的是反常的。您想要一个数字,您的值是 1。那 数值,它与 1.00 相同。如果您希望以特定格式显示该值,则需要一个字符串。
  • 在 JSON 中使用带有额外零小数的数字绝对没有意义。您将无法在 JavaScript 中阅读它们。因此,如果您将它们保留为数字,它们在那里只是自重。如果您希望 JSON 继承数字格式,请使用字符串。
  • “我需要 2 个小数点”-> 不,你不需要。认真思考为什么你认为你需要它。

标签: php json decimalformat


【解决方案1】:

听起来您正在寻找JSON_PRESERVE_ZERO_FRACTION,在 PHP 5.6.6 中可用。在以前的版本中,您需要转换为字符串或将其吸收并接受浮点数和整数在没有小数值时是等价的。

$numbers = [1.00,2.00];

echo $res = json_encode($numbers,JSON_PRESERVE_ZERO_FRACTION);

【讨论】:

  • 1.0 和 1.00 相差 0。您编写的任何处理 1.00 的代码都将具有与 1.0 相同的结果,包括检查精度。如果您关心用户的输出,请使用字符串。
  • 1.00 和 1 之间也有 0 的差异,但请告诉 OP... :)
  • 认为在检查 1.0 是否为浮点类型与整数时(或者可能在检查 1 是否为浮点类型时)存在细微差异,这可能是相关的。但是 1.0 和 1.00 都是严格等价的,几乎可以肯定的是,在设置任何“double”或“float”位后,编译器会删除尾随零。
【解决方案2】:
$numbers = [1.00,2.00];

在这里,您的数字已经失去了“十进制值”。说真的,在这行之后尝试var_dump,你也不会从中得到.00

浮点数和整数只包含数值,不以任何方式保留格式。这不是json_encode 的问题,而是计算中数值的基本真理。

如果你想保留格式,你需要一直使用字符串。

【讨论】:

    【解决方案3】:

    您可以按如下方式使用您的代码:

    <?php
     $numbers = [1.00,2.00];
    
     foreach ($numbers as $i => $number) 
     {
        $numbers[$i] = number_format($number, 2, '.', null);
     }
    
      echo $res = json_encode($numbers); // ["1.00","2.00"]
      echo str_replace('"', '', $res); //[1.00,2.00]
     ?>
    

    和您的预期输出:[1.00,2.00] 相同。

    【讨论】:

    • 这太危险了,因为如果我有一个带有字符串值的 json,例如 "name: A, "age" : 19.... 它也会删除字符串上的 ""
    • 好的。我根据您的问题和预期结果进行了回复。
    • 如果OP想要的是废话,那么没有必要向后弯腰来实现他们的愿望。
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多