为什么mysql格式函数设置动作有问题?

时间:2017-03-03 03:26:16

标签: mysql

首先,列创建如下:

 `avg_price` float NOT NULL default 0,
 `total_price` float NOT NULL default 0,
 `count` int(11) NOT NULL default 0,

当我执行这样的动作时:

update `member`  set avg_price = format(`total_price`/`count`,2) where id =  971473

结果不符合我的期望。当total_price为9003且计数为4时,avg_price预计会更新为2250.75,但它只会更新为2。

有人可以告诉我为什么会这样,非常感谢。

3 个答案:

答案 0 :(得分:2)

  1. format()生成一个字符串,其中可能包含逗号。没有什么可以保证format()结果可以存储到FLOAT中。
  2. 您不应该尝试来控制FLOAT值的小数精度。 FLOAT没有小数位,它们有二进制位置,所以任何这样的尝试都注定要失败。
  3. 你不应该首先使用FLOAT。永远不要使用浮点钱。您应该将货币值保存为DECIMAL,而不是FLOAT,例如DECIMAL(10,2)。这样可以一举解决整个问题。
  4. 由于avg_price可以从total_pricecount计算得出,因此有一个强有力的理由说它根本不应该是一个列,并且这是一个违规行为3NF您可以通过select total_price/count as avg_price随时获取。您可能希望在该阶段对其进行格式化。不在数据库中。

答案 1 :(得分:1)

你能解释一下这个问题是什么吗?

update `member`
    set avg_price = 8765.33
    where id =  971473;

format()应该做什么?您已将avg_price声明为float,因此无需使用返回字符串的函数。

答案 2 :(得分:0)

戈登解释了你应该做什么,但未能解释为什么你只得到8的价值。

format(8765.33,2)以字符串形式返回'8,765.33'。然后Mysql尝试将此字符串转换为数字。在转换过程中,只要该值可以解释为数字,mysql就会逐个字符地处理字符串。逗号在数字中没有位置,因此mysql在那里停止处理字符串并返回它可以解释为数字的值 - 这是8。

如果要格式化的数字小于1000,则format()不会在字符串中放置逗号,因此mysql可以将字符串转换为数字。我想您只想对数字进行舍入,因此请改用round()函数:

round(`total_price`/`count`,2)

还考虑使用decimal data type来存储任何价格,因为它存储的是精确值而不是浮点数。

其余的由戈登解释。