Модель Laravel приходит с неправильным целым числом после создания - но хорошо в другом месте - PullRequest
0 голосов
/ 29 октября 2019

Я подключил API к форме, которая создает экземпляр класса Laravel, сохраняет его в базе данных и возвращает json:

    $record = $request->all();
    $record['client_id'] = $client->id;
    $record['price'] = $record['price'] * 100; // price sent in pounds, needs converting to pence

    $newRecord = CustomerServicePrice::create($record);
    return response()->json($newRecord->toJson());

Я не использую какие-либо необычные пакеты Laravel илиsql, все нормально, Innodb.

Итак, когда приходит $record['price'], ему присваивается строка '2.30' - мой код, как вы можете видеть, умножает его на 100, прежде чем сохранитьк целочисленному столбцу в базе данных.

Запись отлично записывается в базу данных как 230. Но по какой-то причине $newRecord->price выходит как 229. Если я получаю запись через другой API иотрендерить его, он правильно отображает как 230 - только после создания он возвращает мне неправильное значение 229, и это происходит не со всеми числами - если я отправлю «2,40», он правильно покажет мне 240, он изолирован для некоторыхтолько значения.

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

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Это похоже на ошибку округления. Поскольку он входит в виде десятичного числа, в базе данных возникает ошибка с плавающей запятой, которая, вероятно, иногда приводит к ее округлению до 229. Я предлагаю преобразовать команду в целое число с

$record['price'] = (int) ($record['price'] * 100);

или чем-то ещеи посмотрите, решит ли это проблему.

Редактировать: Попробуйте то, что Бениамин Н предложил ниже, используя Round ()

0 голосов
/ 29 октября 2019

В основном это потому, что числа с плавающей точкой обрабатываются большинством языков программирования и компьютеров в целом. Число 2.30 не может быть точно представлено как сумма степеней 2. Например, в JS:

'2.30' * 100

дает:

229.99999999999997

Вы можете прочитать об этом, например, здесь .

Существует множество способов обойти решения, такие как округление, использование специализированных математических библиотек (например, BCMath в php) и другие. В вашем случае просто:

round($record['price'] * 100.0);

должен решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...