using bigdecimal instead of double