Bug #26223 bug double type operator
Submitted: 9 Feb 2007 15:18 Modified: 9 Feb 2007 20:17
Reporter: Rafael Aguiar Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server Severity:S1 (Critical)
Version:5.0.27 OS:Windows (Windows XP XP2)
Assigned to: CPU Architecture:Any
Tags: bug;double;operator

[9 Feb 2007 15:18] Rafael Aguiar
Description:
Select documento, (valorpago-juros+desconto) as Baixa,
valorpago, juros, desconto, total, total - (valorpago-juros+desconto) as dif
From contareceberpagar
Where documento ='27701'

Incredible Result in "Mysql Query Browser":

documento   Baixa   Valor Pago   juros  desconto  total   DIF
27701      315.56       418.59  103.03         0  315.56  5.6843418860808e-014

The column calculated DIF is 0, not 5.6843418860808e-014,  obvious.

many problems because this.

Rafael
rafael@goldnetsis.com.br
=================================================================
structure of table
CREATE TABLE  `contareceberpagar` (
  `CONTARECEBERPAGAR_ID` float NOT NULL default '0',
  `PEDIDO_ID` float default NULL,
  `NOTAFISCAL_ID` float default NULL,
  `PARCEIRO_CLIENTE_ID` float default NULL,
  `MOEDA_ID` float default NULL,
  `PARCEIRO_VENDEDOR_ID` float default NULL,
  `BANCO_ID` float default NULL,
  `CENTROCUSTORECEITA_ID` float default NULL,
  `CATEGORIACONTA_ID` float default NULL,
  `PARCEIRO_FORNECEDOR_ID` float default NULL,
  `EMISSAO` date default NULL,
  `VENCIMENTO` date default NULL,
  `DOCUMENTO` varchar(20) default NULL,
  `TOTAL` double default NULL,
  `VALORPAGO` double default NULL,
  `VALOREMABERTO` double default NULL,
  `PARCELA` varchar(5) default NULL,
  `FORMAPAGAMENTO` varchar(2) NOT NULL default '',
  `SYS_EMPRESA_ID` float default NULL,
  `SYS_FILIAL_ID` float default NULL,
  `USUARIOCRIACAO` float default NULL,
  `USUARIOALTERACAO` float default NULL,
  `ATIVO` char(1) default NULL,
  `ALTERACAO` datetime NOT NULL default '0000-00-00 00:00:00',
  `CRIACAO` datetime NOT NULL default '0000-00-00 00:00:00',
  `VENCIMENTOREAL` date default NULL,
  `PORTADOR` varchar(20) default NULL,
  `MULTAVENCIMENTO` double default NULL,
  `JUROSDIAVENCIMENTO` double default NULL,
  `HISTORICO` varchar(50) default NULL,
  `TIPO` char(1) default NULL,
  `evenda` char(1) default NULL,
  `quitado` char(1) default NULL,
  `STATUS` varchar(2) default NULL,
  `PROCESSADO` char(1) default NULL,
  `DESCONTO` double default NULL,
  `JUROS` double default NULL,
  `COMISSAOLIQUIDEZVALOR` double default NULL,
  `DATAQUITACAO` date default NULL,
  `CONTABANCARIA_ID` float default NULL,
  `DATAULTIMACOBRANCA` date default '0000-00-00',
  `DATAPROXIMACOBRANCA` date default '0000-00-00',
  `OBSCOBRANCA` text,
  `PARCEIRO_COBRADOR_ID` float default '0',
  `COMISSAOCOBRADORVALOR` double default '0',
  `COMISSAOCOBRADORPERC` double default '0',
  `NOSSONUMERO` varchar(80) default '',
  `PROXIMONOSSONUMERO` double default '0',
  `DATAPAGAMENTO` date default NULL,
  `IDENTIFICADORIMPRESSAO` varchar(20) default NULL,
  `DEVOLUCAO` double default NULL,
  `COMISSAOPAGA` varchar(1) default NULL,
  `DATAPAGTOCOMISSAO` date default NULL,
  `OBSERVACAO` text,
  `NUMEROREMESSA` varchar(25) default NULL,
  PRIMARY KEY  (`CONTARECEBERPAGAR_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
=====================================================

How to repeat:
structure of table
CREATE TABLE  `contareceberpagar` (
  `CONTARECEBERPAGAR_ID` float NOT NULL default '0',
  `PEDIDO_ID` float default NULL,
  `NOTAFISCAL_ID` float default NULL,
  `PARCEIRO_CLIENTE_ID` float default NULL,
  `MOEDA_ID` float default NULL,
  `PARCEIRO_VENDEDOR_ID` float default NULL,
  `BANCO_ID` float default NULL,
  `CENTROCUSTORECEITA_ID` float default NULL,
  `CATEGORIACONTA_ID` float default NULL,
  `PARCEIRO_FORNECEDOR_ID` float default NULL,
  `EMISSAO` date default NULL,
  `VENCIMENTO` date default NULL,
  `DOCUMENTO` varchar(20) default NULL,
  `TOTAL` double default NULL,
  `VALORPAGO` double default NULL,
  `VALOREMABERTO` double default NULL,
  `PARCELA` varchar(5) default NULL,
  `FORMAPAGAMENTO` varchar(2) NOT NULL default '',
  `SYS_EMPRESA_ID` float default NULL,
  `SYS_FILIAL_ID` float default NULL,
  `USUARIOCRIACAO` float default NULL,
  `USUARIOALTERACAO` float default NULL,
  `ATIVO` char(1) default NULL,
  `ALTERACAO` datetime NOT NULL default '0000-00-00 00:00:00',
  `CRIACAO` datetime NOT NULL default '0000-00-00 00:00:00',
  `VENCIMENTOREAL` date default NULL,
  `PORTADOR` varchar(20) default NULL,
  `MULTAVENCIMENTO` double default NULL,
  `JUROSDIAVENCIMENTO` double default NULL,
  `HISTORICO` varchar(50) default NULL,
  `TIPO` char(1) default NULL,
  `evenda` char(1) default NULL,
  `quitado` char(1) default NULL,
  `STATUS` varchar(2) default NULL,
  `PROCESSADO` char(1) default NULL,
  `DESCONTO` double default NULL,
  `JUROS` double default NULL,
  `COMISSAOLIQUIDEZVALOR` double default NULL,
  `DATAQUITACAO` date default NULL,
  `CONTABANCARIA_ID` float default NULL,
  `DATAULTIMACOBRANCA` date default '0000-00-00',
  `DATAPROXIMACOBRANCA` date default '0000-00-00',
  `OBSCOBRANCA` text,
  `PARCEIRO_COBRADOR_ID` float default '0',
  `COMISSAOCOBRADORVALOR` double default '0',
  `COMISSAOCOBRADORPERC` double default '0',
  `NOSSONUMERO` varchar(80) default '',
  `PROXIMONOSSONUMERO` double default '0',
  `DATAPAGAMENTO` date default NULL,
  `IDENTIFICADORIMPRESSAO` varchar(20) default NULL,
  `DEVOLUCAO` double default NULL,
  `COMISSAOPAGA` varchar(1) default NULL,
  `DATAPAGTOCOMISSAO` date default NULL,
  `OBSERVACAO` text,
  `NUMEROREMESSA` varchar(25) default NULL,
  PRIMARY KEY  (`CONTARECEBERPAGAR_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
=====================================================
[9 Feb 2007 20:17] Hartmut Holzgraefe
Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://dev.mysql.com/doc/ and the instructions on
how to report a bug at http://bugs.mysql.com/how-to-report.php

FLOAT and DOUBLE are stored in binary format internaly, so rounding errors are expected when using decimal digits. When dealing with currency values or other high precision demands (and where performance is less of an issue) you should use DECIMAL instead