2017-02-22 17 views
0

У меня есть два номера в моей базе данных, которые я хочу вычесть с помощью функций intval() и bcdiv. Я не знаю, почему один из номеров пришел как string другой является floatВычитание двух чисел не сохраняется в базе данных

Это var_dump обоих чисел

number1: float(0.11037128) 
number2: string(10) "0.19902165" 

Функция, которую я пытаюсь выполнить

$result = $number1 - $number2; 

// var_dump($result) return float(-0.08865037) 
$res->result = bcdiv(intval($number1 - $number2), 100000000, 8)); 

$res->save(); 

Столбец, в который я хочу сохранить этот результат, - DECIMAL (20,8).

Ошибок нет. Страница перезагружается нормально. Все остальное было сохранено в базе данных, кроме этого результата.

Я использую рамки Laravel, и это в моем контроллере. Есть идеи?

+0

Что такое вывод 'bcdiv()' using 'var_dump()'? –

+0

@VaibhavrajRoham 'var_dump (bcdiv ($ number1, $ number2));' return 'string (1)" 0 "', но я уверен, что 'bcdiv()' работает правильно, потому что я использую его на других страницах , – VLS

+0

Для тестового случая укажите 2 номера, которые не возвратят '0'' bcdiv() ' –

ответ

1

Если вы делаете

$number1 = 0.11037128; 
$number2 = 0.19902165; 
$res->result = bcdiv(intval($number1 - $number2), 100000000, 8)); 

, конечно, вы собираетесь получить 0.00000000 только.

Согласно documentation из intval(), он выбирает целочисленное значение из числа. Итак, после intval($number1 - $number2) вы получите 0, следовательно, вы получите 0.00000000 как bcdiv().

USECASE Я использовал

$number1 = 10.11037128; // Changed this number 
$number2 = 0.19902165; 
var_dump(bcdiv(intval($number1 - $number2), 100000000, 8)); 

, который дает выход как

string(10) "0.00000009" 

Приведи bcdiv docs и intval docs.

Отредактировано

Если у вас есть проблемы с числами, как получить тип строки и т.д. затем попытаться типаж их, как показано ниже.

$number1 = (float) 10.11037128; 
$number2 = (float) 0.19902165; 
+0

Итак, это не проблема, а нормальное поведение bcdiv? Не знал этого. Поэтому я могу просто поразмышлять, как '$ res-> result = $ number1 - $ number2;'? Я имею в виду, мне нужно беспокоиться о длине после разделителя и округления .. и т. Д.? – VLS

+0

Точно! все верно. И то, что вы хотите использовать, полностью зависит от вашего приложения и вас. –

+0

Мне нужно округлить и сохранить с этой длиной '0.XXXXXXXX', т.е. 8 символов после разделителя. Будет делать несколько тестов, но, похоже, сейчас работает. Благодарю. – VLS

1

Операнды bcdiv исключая "масштаб" должны быть строками Может быть, это проблема

http://php.net/manual/en/function.bcdiv.php

+0

Я попытался превратить число с плавающей точкой в ​​строку с помощью функции 'strval()', но все равно не сохраняет результат в базе данных. – VLS