Float类型科学计数和精度丢失问题
背景:
开发一套支持配置批量处理某一组接口的工作流,请求体完全由前端定义数据类型和输入具体的值,如果请求体中某字段是float类型,后端接口不支持以string类型代替
问题:
float类型会出现自动转换成科学计数和精度丢失的两种问题
parseFloat("99999999999999999") //10000000000000000
parseFloat("0.0000000000000001") //1e-16
解决方案:
尝试调查是否存在第三方库解决float精度丢失问题,但是调查一圈之后得到的结论为:大部分的第三方库是通过将float类型的数据转换成string类型或者Array类型,并提供封装好的计算方法,保障数值的计算不会出问题,而不是提供不丢失精度的Number类型的数据
参考上述解决思路,决定将float类型转换成string类型处理,但是如何解决后端接口不支持float类型的字段呢?
收买 or 武力威胁 ? 答案是JSON.stringfiy()
既然请求体最终是string类型,处理不了单个的namberValue:123,我还处理不了整个的json串吗?
于是在float类型输入值时,我就把输入的值拼接成了"##value##"这种方式,在最后发送请求前,let newParam = JSON.stringfiy(param),并使用split('\"##').join('')把我定义的特殊字符连同前后的双引号一起干掉了,至此世界再次和平。
当然,实际代码逻辑中,特殊字符肯定不是##,我是使用生成UUID+特殊字符的方式,保证不会误处理其他的用户输入的string类型
OK,以上方法确实不够优雅,欢迎大佬不吝赐教。 下班,下班