mysql十进制和双精度数据问题

Posted

技术标签:

【中文标题】mysql十进制和双精度数据问题【英文标题】:mysql decimal and double data issue 【发布时间】:2015-11-26 02:18:55 【问题描述】:

我正在尝试将货币数据存储在 mysql 中。在这里,我使用了decimaldouble 数据类型。

这是我的表结构:

CREATE TABLE IF NOT EXISTS transactions (
  tb_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  tb_our_rate DECIMAL(15, 2) NOT NULL,
  tb_bank_rate DECIMAL(15, 2) NOT NULL,
  tb_lkr_funds DOUBLE(15, 2) NOT NULL,
  tb_aud_funds DOUBLE(15, 2) NOT NULL,  
  PRIMARY KEY (tb_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

我尝试在这些列中插入一些值。这是我插入的值。

133.11
120.20
-12312,123,123.02
-12312,231,423.32

这是它插入数据库的方式:

mysql> select * from transactions\G
*************************** 1. row ***************************
   tb_our_rate: 13311.00
  tb_bank_rate: 12020.00
  tb_lkr_funds: -1231212312302.00
  tb_aud_funds: -1231223142332.00
    date_added: 2015-11-26 07:36:01
*************************** 2. row ***************************

更新: 这就是我的插入查询的工作方式:

$our_rate   = filter_input(INPUT_POST, 'our_rate', FILTER_SANITIZE_NUMBER_FLOAT);
$bank_rate  = filter_input(INPUT_POST, 'bank_rate', FILTER_SANITIZE_NUMBER_FLOAT);
$lkr_funds  = filter_input(INPUT_POST, 'lkr_funds', FILTER_SANITIZE_NUMBER_FLOAT);
$aud_funds  = filter_input(INPUT_POST, 'aud_funds', FILTER_SANITIZE_NUMBER_FLOAT);

$query = "INSERT INTO transaction_banks( 
                              tb_our_rate
                            , tb_bank_rate
                            , tb_lkr_funds
                            , tb_aud_funds
                            , date_added
                            ) VALUES (?, ?, ?, ?)";
$insert_stmt = $mysqli->prepare($query);

if ($insert_stmt)
    $insert_stmt->bind_param('dddd', 
                                $our_rate
                              , $bank_rate
                              , $lkr_funds
                              , $aud_funds
                            );
  $insert_stmt->execute(); 

谁能告诉我这是什么问题?

【问题讨论】:

为一件事丢掉逗号 是的,十进制值也插入不正确 显示创建表语句和实际插入语句。不要描述他们 用表格结构更新问题 Drew 的意思是在将逗号插入表格之前将其丢失。在插入之前正确格式化您的号码。 【参考方案1】:

删除FILTER_SANITIZE_NUMBER_FLOAT。这会删除您输入中的.

检查这个documentation。

它会清理输入,并且只允许 +-

你可以使用FILTER_FLAG_ALLOW_FRACTION:

$our_rate   = filter_input(INPUT_POST, 'our_rate', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$bank_rate  = filter_input(INPUT_POST, 'bank_rate', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$lkr_funds  = filter_input(INPUT_POST, 'lkr_funds', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$aud_funds  = filter_input(INPUT_POST, 'aud_funds', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

查看this上一个关于这个问题的问题。

【讨论】:

【参考方案2】:

这对我来说看起来不错。不要在数字中插入逗号。我什至不敢尝试。

create table thing99
(   id int auto_increment primary key,
    tb_our_rate DECIMAL(15, 2) NOT NULL,
    tb_bank_rate DECIMAL(15, 2) NOT NULL,
    tb_lkr_funds DOUBLE(15, 2) NOT NULL,
    tb_aud_funds DOUBLE(15, 2) NOT NULL
);


insert thing99(tb_our_rate,tb_bank_rate,tb_lkr_funds,tb_aud_funds) values
(133.11,120.20,-12312123123.02,-12312231423.32);

select * from thing99;
+----+-------------+--------------+-----------------+-----------------+
| id | tb_our_rate | tb_bank_rate | tb_lkr_funds    | tb_aud_funds    |
+----+-------------+--------------+-----------------+-----------------+
|  1 |      133.11 |       120.20 | -12312123123.02 | -12312231423.32 |
+----+-------------+--------------+-----------------+-----------------+

编辑:

刚刚找到。您必须使用下面的选项 2。

$our_rate   = filter_input(INPUT_POST, 'our_rate', FILTER_SANITIZE_NUMBER_FLOAT);

$our_rate2=filter_input(INPUT_POST,'our_rate',
FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);



echo $our_rate."<br>";
echo $our_rate2."<br>";

测试

来自Filter Flags 和 FILTER_FLAG_ALLOW_FRACTION 的手册页:

【讨论】:

Drew,在插入 mysql 之前是否需要删除逗号?因为我的帖子数组即将到来的日期像这样aud_funds -12312,231,423.32 过滤器去掉逗号。它留下数字和 +/- 和句点

以上是关于mysql十进制和双精度数据问题的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中十进制、浮点和双精度的区别?

在 .net 中,如何在十进制和双精度之间进行选择

在 .net 中,如何在十进制和双精度之间进行选择

单精度和双精度浮点值有啥不同? [复制]

与浮点数和双精度相关的概念

double精确到几位小数