Numeric values with decimals are not used when there is no tolerance for error because of the standard way of storing numbers in memory result in values being encoded into a binary fashion. That means a number is represented as a sum of fractions once or zero times from the set { 1, 1/2, 2, 1/4, 4, 1/8, 8, ... }. Most of the time, you can not sum to a given terminating decimal with a finite number of these but you can normally get close enough. This is fine for working with numbers for science where a small error factor is understood and accounted for. We like to be perfectly precise which is why APIs work with sats rather than BTCs. So if you are working with fraction values, as a string, you wont lose information when encoding.
Actually that's good point. Initially i wanted to mentioned built-in data type which offer custom exact precision, but from quick search it looks like TypeScript doesn't offer such thing.