I've finally had a moment to look at this. Thanks for your patience.
The problem here is that a small floating-point error is introduced during the calculation, because of the way that numbers are represented internally. For historic reasons, Numbas uses javascript's built-in floating-point number representation by default. This can only be relied on to be accurate to about 15 significant figures.
In order to account for this, Numbas adds a bit of "wiggle room" to the minimum and maximum accepted values for number entry parts. Until now, this was a fixed value of 10^-12. When the given values are big, this difference can't be represented in floating-point, so the value stays incorrect. Numbas then converts the values to the more precise "decimal" representation, which can tell such small differences. So when you give as your answer the correct value, Numbas says it's not the value it was expecting, which has a small error added on, so says it's wrong.
The reason it works when you turn on the "decimal places" precision restriction is that this forces Numbas to round off both student and expected values in the decimal format, ensuring they're equal.
I've changed the logic so that the size of the wiggle room depends on the size of the original number: for a number on the order of 10^n, the wiggle room will be 10^(n-12).
Everything about this is unsatisfying: ideally, there'd be no rounding errors at all, and I wouldn't have to think about this. But exact arithmetic is very slow, and has its own set of complications.
(If anyone is interested, I have actually ported an exact constructive real arithmetic library to javascript, and there's an item on the to-do list to integrate it with Numbas:
https://github.com/numbas/Numbas/issues/893)