Jasmine
Administrator
Jan 19, 2001, 2:29 PM
Post #1 of 1
(1948 views)

Why am I getting long decimals (eg, 19.94999999999

Can't Post


(From the Perl FAQ) Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)? The infinite set that a mathematician thinks of as the real numbers can only be approximate on a computer, since the computer only has a finite number of bits to store an infinite number of, um, numbers. Internally, your computer represents floatingpoint numbers in binary. Floatingpoint numbers read in from a file or appearing as literals in your program are converted from their decimal floatingpoint representation (eg, 19.95) to the internal binary representation. However, 19.95 can't be precisely represented as a binary floatingpoint number, just like 1/3 can't be exactly represented as a decimal floatingpoint number. The computer's binary representation of 19.95, therefore, isn't exactly 19.95. When a floatingpoint number gets printed, the binary floatingpoint representation is converted back to decimal. These decimal numbers are displayed in either the format you specify with printf(), or the current output format for numbers (see $# if you use print. $# has a different default value in Perl5 than it did in Perl4. Changing $# yourself is deprecated. This affects all computer languages that represent decimal floatingpoint numbers in binary, not just Perl. Perl provides arbitraryprecision decimal numbers with the Math::BigFloat module (part of the standard Perl distribution), but mathematical operations are consequently slower. To get rid of the superfluous digits, just use a format (eg, printf("%.2f", 19.95)) to get the required precision. See Floatingpoint Arithmetic.
