Let's start by understanding that ROUND() has TWO purposes.
First, you round off things because you want to provide an approximation, or perhaps an order of magnitude number to represent the results of a larger data grouping. When used this way, ROUND is a FORMATTING function and you would do better to use the FORMAT( x, template ) method to limit what you show.
Second, you round off because you have fractions that you don't want to keep at ANY level of computation. For example, an interest or tax computation that works on dollars and cents even though the math would produce another couple of digits (fractional dollars x fraction tax rate = even smaller amounts of useless fractions). Here, you run into a couple of issues. First, is there a regulatory limit on what you can track? Second, is the data type you are using a reasonable method for tracking what you track?
If you have regulatory limits, you might have to apply ROUND() after each computation where such action is appropriate. But then there is the matter that DOUBLE data type retains as many fractional digits as will fit, even if those digits lose meaning (or the more proper term, "lose significance.") Sometimes you do better using a CURRENCY data type, which involves a scaled integer that keeps a fixed decimal point (at 4 places) and provides 15 digits to the left of the decimal. This data type takes up the same amount of space as DOUBLE (8 bytes) but is less likely to have a worrisome rounding.