Mysql
 sql >> Database >  >> RDS >> Mysql

Quando aggiungo xx alla colonna float di mysql, è un risultato sbagliato, è un bug?

Il tuo problema ha qualcosa a che fare con quanto è grande il tuo valore in virgola mobile, ma non sono sicuro al 100% del perché. Ho provato ad aggiornare una riga simile con numeri più piccoli e ha funzionato bene. Dovresti anche astenerti dall'utilizzare virgolette ove possibile poiché richiede un'elaborazione aggiuntiva. Vedi questa domanda SO:aggiorna una colonna sottraendo un valore

Ecco la mia soluzione semplice, proprio come ha suggerito Tim Biegeleisen:

CREATE TABLE `xxx` (
  `uid` int(11) NOT NULL,
  `money` decimal(10,2) NOT NULL DEFAULT '0.00' ,
  `real_money` float(10,2) NOT NULL ,
  `available_invoice` float(10,2) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

Inserisci:

USE dbname;
insert into xxx Values(1234, 99959040.00, 0.00, 99999.00);

Aggiorna senza stringhe:

update xxx set money = money - 20 where uid = 1234;

Ci sono alcune cose strane quando si calcola con grandi valori in virgola mobile. Alcuni di questi problemi dipendono dalla macchina e sono correlati al tipo di processore in uso. Maggiori informazioni qui:http://dev.mysql .com/doc/refman/5.7/en/problems-with-float.html

Inoltre, secondo un'altra domanda SO, i valori in virgola mobile NON sono un buon modo per memorizzare i valori monetari. Differenza tra tipo di dati float e decimal (vedi la seconda risposta).

Sembra che usando decimal e numeric i tipi di dati sono i migliori per le colonne di denaro in MySQL.