Сохранить число с плавающей запятой в столбце DECIMAL в PHP / Mysql - PullRequest
0 голосов
/ 07 апреля 2020

Я хотел бы сохранить число с плавающей запятой в столбце DECIMAL (4, 2):

<?php    

$num  = 5.26;
$num2 = 5.259999999999999;

echo number_format($num, 50);
echo "<br>";
echo number_format($num2, 50);
echo "<br>";

$mysqli = new mysqli("localhost:3306", "root", "", "test");

if ($mysqli->connect_errno) {
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}

$query = "INSERT INTO `test` (`value`) VALUES (?)";

if (!($stmt = $mysqli->prepare($query))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->bind_param("d", $num)) { // or $num2
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

$warnings = $mysqli->get_warnings();

echo "<PRE>";
print_r($warnings);
exit;

?>

Для $num проблем нет, но для $num2 я получаю следующий вывод :

5.25999999999999978683717927196994423866271972656250
5.25999999999999889865875957184471189975738525390625

mysqli_warning Object
(
    [message] => Data truncated for column 'value' at row 1
    [sqlstate] => HY000
    [errno] => 1265
)

Может кто-нибудь объяснить мне, что внутри Mysql происходит с моим числом с плавающей запятой? Как это конвертируется / обрабатывается? Как Mysql обнаруживает, что в своей «оригинальной» форме $num вписывается в DECIMAL (4, 2), но $num2 имеет более 2 десятичных знаков? Я думал, что подсчет десятичных разрядов числа с плавающей запятой возможен только в его строковом представлении. Но - как вы можете видеть выше - строковый формат для обоих чисел очень «длинный». Так что я немного растерялся: как Mysql знает, что $num в порядке, а $num2 нет.

Мои пользователи работают с числами с плавающей запятой, и я хотел бы избежать предупреждений Mysql : на основе тех же логик c, которые использует Mysql, я бы хотел предупредить их о округлении, но только если это действительно необходимо: round($num2, 2). Поэтому нет округления для $num, где десятичные цифры (2+) в строковом формате вызваны только точностью с плавающей запятой, в то время как в $num2 десятичные цифры (2+) уже существовали в своей «исходной» форме .

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