找回密码
 立即注册

QQ登录

只需一步,快速开始

Simon.hu 讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2019-6-24 14:38  /   查看:6051  /  回复:0
本帖最后由 Simon.hu 于 2024-12-16 15:33 编辑

作为一个不但可以开发Web应用有可以用了解计算机相关理论知识的产品社区,这次我们又要给大家普及一下一个新的名词-----------浮点误差。

为什么我要给答案及普及这个知识呢?
大家在使用活字格的时候,你会发现一些很奇怪的现象,如下用例:
我有一个表,其中他有2列:【金额】【**额】,他们都是小数列,并且我在其中添加了数据,金额:741.6    **额:700
image.png542131042.png
然后我做了一个公式字段,未开票等于金额减去**额,如下:
image.png245807799.png
然后我们就将其设置绑定到页面的表格上
image.png58098143.png
但是尴尬的时候来了,等我运行以后,在浏览器上发现这个【未开票】多了好长的一串0000002等等字符
image.png859663390.png

为什么会出现这样的情况呢?
原因就是浮点误差!!!!!!!

浮点误差是什么?
其实,这就是计算机的一点的小小的机制导致:二进制表示十进制的时候会有小误差。
  1. 浮点数的误差的产生一般由于两个原因
  2. 1)由于计算机内部以二进制保存,所以十进制的有限位的小数,在计算机内部会是一个无限位的小数。
  3. 例如 十进制的0.9虽然只有一位小数,转成2进制是无限循环小数0.1110011001100110011...
  4. 2)计算机保存浮点数的精度有限,例如float可以保留十进制最多7位(二进制23位)有效数字,double 可以保留十进制15~16位(二进制52位)有效数字。那有效数字以后的就被忽略了。
  5. 例如上面的0.9的表示受精度所限,精度以后的就被忽略了,这样
  6. float时,它是0.89999998
  7. double时,它是0.90000000000000002
复制代码

科普完毕!!!
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>我是一条可爱的分割线<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

如何在活字格中避免浮点误差?

之前的科普可能会让你觉得这个问题,既然是二进制和十进制的转换问题,不管你怎么设置都躲不过啊?
老铁,你说的确实没毛病,但是,搞活字格的脑洞不大,你怎么能做好呢?

我要开始表演了哈~
既然他是因为小数在二进制和十进制的小数问题上,那我们可以想一下怎么让他没有小数呢????
当然有办法了,比如一般的跟金额相关的数字,无非就是2位小数么,那我们完全可以先给他乘以100,然后在做运算,最后在给结果除以100不就行了
比如,我把这个公式字段修改成:
image.png405993956.png


那么在浏览器上不就好了么?
image.png351551207.png
当然很多的小伙伴也在使用round函数在处理,也是可以的。
image.png740233764.png

我主张不管使用什么办法,只要能达到目的都是好办法!



0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部