Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Php и MongoDB округление числа
Форумы портала PHP.SU » » Вопросы новичков » Php и MongoDB округление числа

Страниц (1): [1]
 

1. new01 - 23 Июня, 2016 - 16:18:22 - перейти к сообщению
Здравствуйте!

В MongoDB хранится документ с такой переменной:
CODE (htmlphp):
скопировать код в буфер обмена
  1. "num": 0.6017737223301083

Посредством php нахожу этот документ
PHP:
скопировать код в буфер обмена
  1.  
  2. $collection = $connection->selectDB('admin')->selectCollection('games');
  3.                 $rangeQuery = array("idgame"=>$idGame);
  4. $game = $collection->findOne($rangeQuery);
  5.  

но при выводе переменной $game['num'] я получаю значение 0.60177372233011 ВМЕСТО 0.6017737223301083, то есть либо PHP, либо MongoDB округляет это число.

Вопрос:
Как получить исходное число без округления?

Буду признателен за любую помощь.
2. Sail - 23 Июня, 2016 - 16:29:58 - перейти к сообщению
new01, попробуйте выбрать из предлагаемых математических расширений.
(Добавление)
Хотя...
PHP:
скопировать код в буфер обмена
  1. $num =  0.6017737223301083;
  2. $str = number_format($num, 16, '.', '');
  3. var_dump($num, $str);
выдает:
Цитата:
float 0.60177372233011
string '0.6017737223301083' (length=18)
3. new01 - 23 Июня, 2016 - 17:14:49 - перейти к сообщению
Sail пишет:
new01, попробуйте выбрать из предлагаемых математических расширений.
(Добавление)
Хотя...
PHP:
скопировать код в буфер обмена
  1. $num =  0.6017737223301083;
  2. $str = number_format($num, 16, '.', '');
  3. var_dump($num, $str);
выдает:
Цитата:
float 0.60177372233011
string '0.6017737223301083' (length=18)

В бд он записан как число. И php его получаем числом и сразу округляем. Даже функция number_format не помогает, она добавляет 2 нуля в конце Недовольство, огорчение(
4. Мелкий - 23 Июня, 2016 - 17:27:03 - перейти к сообщению
На стороне PHP при выводе вы, скорей всего, упираетесь вот сюда: http://php.net/manual/en/ini.cor...hp#ini.precision Как раз дефолтные 14 разрядов.
Можно приводить к строке, как уже верно сказано, с помощью number_format.

Обязательно к пониманию:
new01 пишет:
В MongoDB хранится документ с такой переменной:

Не имеет отношения к тому числу, которое вы записывали. Монга, а вообще-то, BSON в целом, не умеет чисел с фиксированной запятой. Числа с плавающей запятой же по определению IEEE 754 могут в любой момент плыть в последних разрядах.

Если вам действительно требуется много знаков после запятой, то используйте библиотеки работы с точной математикой по ссылке Sail и что-нибудь придумайте с тем, чтобы всякие монги не пытались приводить входящую строку к числу, а писали именно строку.

 

Powered by ExBB FM 1.0 RC1