Java :   precision... precision... precision...
\n    public String abbreviateProduct(int left, int right) {\n        final long threshold0 = 100_000_000_000_000L,threshold1 = 10_000_000_000L,threshold2 = 100
```\n    public String abbreviateProduct(int left, int right) {\n        final long threshold0 = 100_000_000_000_000L,threshold1 = 10_000_000_000L,threshold2 = 100_000;\n        long curr=1;\n        int i, zerosCount = 0;\n        for(i=left;i<=right && curr<threshold0;i++){\n            curr *= i;\n            while(curr%10==0){\n                curr/=10;\n                zerosCount++;\n            }\n        }\n        if(curr<threshold1)\n            return String.format("%de%d",curr,zerosCount);\n\n        long low=curr%threshold1;\n        double high = curr; //double precision is more accurate than long when we need to divide by 10 by 10 and multiply again\n        while(high>threshold1)\n            high/=10;\n        \n        for(;i<=right;i++){\n            low  *=i;\n            high *=i;\n            while(low%10==0){\n                low/=10;\n                zerosCount++;\n            }\n            if(low>=threshold1)\n                low %= threshold1;\n            while(high>threshold1)\n                high/=10;\n        }\n\n        while(high>=threshold2)\n            high/=10;\n        low %= threshold2;\n        return String.format("%d...%05de%d",(int)high,low,zerosCount);\n    }\n```
[]