PHP: как предотвратить автоматическое округление числа json_encode?

Имея большую проблему с 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: НЕ СТРОКА :)


person sa.lva.ge    schedule 09.06.2015    source источник
comment
Просто удалите параметр JSON_NUMERIC_CHECK. Он будет кодировать ваши отформатированные числа в виде строк.   -  person martynasma    schedule 09.06.2015
comment
Целое число — это просто число. У него нет определенного количества знаков после запятой. Вы форматируете свои целые числа в строки, которые могут иметь любой выбранный вами макет, но затем специально кодируете полученные строки как числа. Вы получаете то, для чего просите код. Если вам нужен определенный формат, передайте числа как отформатированные строки   -  person    schedule 09.06.2015
comment
@martynasma, тогда это приводит меня к веревке.   -  person sa.lva.ge    schedule 09.06.2015
comment
@HoboSapiens, я обновляю свой вопрос. можете ли вы предоставить мне пример   -  person sa.lva.ge    schedule 09.06.2015
comment
Это PHP автоматически меняет тип данных с float на integer, если вам нужно, чтобы json выводил 1.00 вместо 1, вы можете попробовать добавить (string) или (float) перед number_format(), что означает (string)number_format()   -  person Allen Chak    schedule 09.06.2015
comment
@sa.lva.ge Нет, я не могу, потому что то, что ты делаешь, извращенно. Вам нужно число, ваше значение равно 1. Это является числовым значением, и оно идентично 1,00. Если вы хотите, чтобы это значение было представлено в определенном формате, вам нужна строка.   -  person    schedule 09.06.2015
comment
Нет абсолютно никакого смысла в числах с дополнительными нулевыми десятичными знаками в JSON. Вы не сможете прочитать их в JavaScript. Так что они там просто мертвым грузом, если вы сохраните их числом. Используйте строки, если вы хотите, чтобы JSON переносил форматирование чисел.   -  person martynasma    schedule 09.06.2015
comment
@AllenChak, можешь привести пример? спасибо   -  person sa.lva.ge    schedule 09.06.2015
comment
@Аллен (string)number_format() бессмысленно. number_format уже возвращает строку, повторное приведение ничего не даст. Если number_format не возвращает строку, приведение ее к единице также не поможет сохранить форматирование, потому что int или float не имеют форматирования, а приведение к строке ничего не добавит.   -  person deceze♦    schedule 09.06.2015
comment
Мне нужно 2 десятичных знака -> Нет, не нужно. Хорошо подумайте, почему вам это нужно.   -  person Jasper N. Brouwer    schedule 09.06.2015
comment
Дубликат: stackoverflow.com/questions/5520399/   -  person Anthony    schedule 09.06.2015


Ответы (3)


Похоже, вы ищете JSON_PRESERVE_ZERO_FRACTION, доступный в PHP 5.6.6. В предыдущих версиях вам нужно будет либо преобразовать в строку, либо принять ее и признать, что числа с плавающей запятой и целые числа эквивалентны, когда нет дробного значения.

$numbers = [1.00,2.00];

echo $res = json_encode($numbers,JSON_PRESERVE_ZERO_FRACTION);
person Anthony    schedule 09.06.2015
comment
Между 1.0 и 1.00 разница 0. Любой код, который вы пишете для работы с 1.00, будет иметь такие же результаты с 1.0, включая проверку точности. Если вас интересует вывод пользователю, используйте строки. - person Anthony; 09.06.2015
comment
Между 1.00 и 1 также есть разница 0, но скажите об этом ОП... :) - person deceze♦; 09.06.2015
comment
Я думаю, что есть небольшие различия при проверке, относится ли 1.0 к типу float или integer (или, может быть, при проверке, относится ли 1 к типу float), которые могут иметь значение. Но 1.0 и 1.00 оба строго эквивалентны, и почти наверняка компилятор отбрасывает конечные нули после установки любого двойного или плавающего бита. - person Anthony; 09.06.2015

$numbers = [1.00,2.00];

Здесь ваши числа уже потеряли свои "десятичные значения". Серьезно, попробуй на них var_dump сразу после этой строчки, .00 от этого тоже не получишь.

Числа с плавающей запятой и целые числа содержат только числовое значение, форматирование никак не сохраняется. Это не проблема json_encode, это фундаментальная истина о числовых значениях в вычислениях.

Если вы хотите сохранить форматирование, вам нужно использовать строки полностью.

person deceze♦    schedule 09.06.2015

Вы можете использовать свой код следующим образом:

<?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], что то же самое.

person Deep Kakkar    schedule 09.06.2015
comment
это так опасно, потому что если бы у меня был json со строковыми значениями, такими как имя: A, возраст: 19 .... он также удалит строку - person sa.lva.ge; 09.06.2015
comment
В порядке. Я ответил в соответствии с вашим вопросом и ожидаемым результатом. - person Deep Kakkar; 09.06.2015
comment
Если то, что хочет ОП, - ерунда, тогда нет необходимости из кожи вон лезть, чтобы выполнить их желание. - person deceze♦; 09.06.2015