Я хотел бы сохранить число с плавающей запятой в столбце 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+) уже существовали в своей «исходной» форме .