version: 5.5.53-MariaDB
I added this table to my MariaDB:
x
CREATE TABLE `myTable` ( `key` int(10) unsigned NOT NULL,
`val_float` float unsigned NOT NULL, `val_bigint` bigint(20) unsigned NOT NULL,
`val_int` int(10) unsigned NOT NULL, PRIMARY KEY (`key`));
and add an entry:
INSERT INTO myTable VALUES (1, 9600240000, 9600240000, 4294967295);
and when I do sum on all columns
select `key`,sum(`val_float`),sum(`val_bigint`),sum(`val_int`) from myTable;
result:
+------+------------------+-------------------+----------------+
| key | sum(`val_float`) | sum(`val_bigint`) | sum(`val_int`) |
+------+------------------+-------------------+----------------+
| 1 | 9600239616 | 9600240000 | 4294967295 |
+------+------------------+-------------------+----------------+
How do I get the wrong value in sum(val_float
) (9600239616 instead of 9600240000)
and right values in the other columns
Thanks
Advertisement
Answer
9600240000 is a number which can’t be represented exactly by float
datatype (IEEE 754 32-bit single precision)
Simple example in C:
#include <stdio.h>
void main()
{
double double_value=9600240000;
float float_value=9600240000;
printf("float: %.14g double: %.14gn", float_value, double_value);
}
When running it, it will produce the following output:
float: 9600239616 double: 9600240000
The binary representation of 9600240000
is 1000111100001110000000100110000000
(34-bits) – even if you would try to store this value in a 32-bit integer, it wouldn’t work. If you need exact results, you should use the DECIMAL
column type.