On Tue, 29 Apr 2014 13:23:07 +1000, Ben Finney wrote: > Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> writes: > >> By the way, you contradict yourself here. Earlier, you described 38.0 >> as having zero decimal places (which is wrong). Here you describe it as >> having one, which is correct, and then in a later post you describe it >> as having zero decimal places again. > > I get the impression that this is at the core of the misunderstanding. > Having a number's representation ending in “….0” does not mean zero > decimal places; it has exactly one. The value's representation contains > the digit “0” after the decimal point, but that digit is significant to > the precision of the representation. > > If the problem could be stated such that “38.0” and “38” and “38.000” > are consistently described with the correct number of decimal digits of > precision (in those examples: one, zero, and three), maybe the > discussion would make more sense.
It's actually trickier than that. Digits of precision can refer to measurement error, or to the underlying storage type. Python floats are C doubles, so they have 64 bits of precision (approximately 17 decimal digits, if I remember correctly) regardless of the precision of the measurement. The OP (Roy) is, I think, trying to guess the measurement precision after the fact, given a float. If the measurement error really does differ from value to value, I don't think he'll have much luck: given a float like 23.0, all we can say is that it has *at least* zero significant decimal places. 23.1 has at least one, 23.1111 has at least four. If you can put an upper bound on the precision, as Roy indicates he can, then perhaps a reasonable approach is to convert to a string rounded to four decimal places, then strip trailing zeroes: py> x = 1234.1 # actual internal is closer to 1234.099999999999909 py> ("%.4f" % x).rstrip('0') '1234.1' then count the number of digits after the dot. (This assumes that the string formatting routines are correctly rounded, which they should be on *most* platforms.) But again, this only gives a lower bound to the number of significant digits -- it's at least one, but might be more. -- Steven -- https://mail.python.org/mailman/listinfo/python-list