老板:你干了五年前端,为什么还犯这个简单的错误?

开发 前端
我的朋友 Lily 已经工作了 5 年,她过去一直担任前端工程师。

我的朋友 Lily 已经工作了 5 年,她过去一直担任前端工程师。

不幸的是,她被老板批评了,因为她在工作中犯了一个错误,这是一个非常简单但容易忽视的问题,我想也是很多朋友容易忽视的一个问题,今天我把它分享出来,希望能够帮助到你,也希望大家遇到这个情况时,不要再放这个错误。

错误的描述

问题可能是这样的,Lily在公司负责一个重大项目,其中一个模块是显示一条与数字相关的信息,这是后端工程师界面返回的信息(仅举例)。

@RestController
@RequestMapping("/getInfo")
public class YupiTestController {
@GetMapping
public Long getNum() {
return 123456789123456789L;
}
}

各位小伙伴,我们调用getInfo接口会返回什么信息呢?会是 123456789123456789 吗?

通过chrome浏览器的调试工具可以看到,似乎一切都和我们想象的一样,结果是123456789123456789。

但是,页面显示的结果是123456789123456780,最后一位是0而不是9。

这到底是怎么回事?这太奇怪了,是不是有点崩溃。

分析出现问题的原因

现在,我们一起来分析一下原因。

我尝试分析返回的数字,发现只有当数字超过16位时才会出现最后几位不一致的问题。

是不是因为数字太大,出现了精度损失?

Java语言中的Long类型是64位的,JavaScript语言中的Long类型是小于64位的吗?

天哪,JavaScript 似乎没有 Long 类型的数据!

实际上,在 JavaScript 中,我们使用 Number 来表示类型 number 的值。

Number 类型的总长度为 64 位。 64位大致就是这样分配的,其中53位代表小数位,10位代表指数位,1位代表符号位。因此,Number 整数的表示范围为 -2^53 ~ 2^53。

让我们尝试在控制台上输出 JavaScript 中的最大值和最小值。

在其他语言中,例如 Java,Long 类型占用 64 个二进制位,最大值为 9223372036854774807 (2⁶³ — 1),长度约为 19 位。

在 JavaScript 中,由于 Number 类型的值也包含小数,所以最大值为 9007199254740993 (2^53 - 1),长度约为 16 位。

所以当Java向JSON返回16位以上的Long类型字段时,前端JavaScript获取的数据会因为溢出而失去精度。

图片

如何解决这个问题呢?

也许我们可以尝试在前端解决这个问题,但我认为我们应该寻求后端工程师的帮助。

我们应该将可能超出范围的数字类型(Long)变量转换为字符串类型(String)。这个是我的个人处理方法,如果你有更好的解决方案,也请欢迎你在留言区跟我一起来分享讨论,让我们大家一起学习进步。

最后总结

其实,在实际编程中,什么样的情况都有可能发生,但是不管怎么样,只要我们认真分析问题,积极找解决方法,问题肯定可以解决,在此,也希望今天分享的这个问题对你有所帮助,如果你觉得有用的话,请点赞我,关注我,并将这篇文章分享给你的开发者朋友,也许能够帮助到他。

最后,感谢你的阅读,祝编程愉快。

责任编辑:华轩 来源: web前端开发
相关推荐

2019-04-16 15:00:13

前端程序员薪资

2020-03-25 13:59:22

前端开发编程

2021-02-27 11:03:26

算法职责ICBU

2013-07-09 13:52:31

程序员Android

2021-02-05 08:09:19

前端框架开发

2021-05-08 23:24:21

前端工具Web

2021-09-10 10:47:58

前端开发JavaScript

2019-01-07 14:46:16

前端开发调查报告

2019-07-18 15:20:22

前端技术PWA

2015-08-26 10:00:31

独立游戏cp错误

2021-09-02 08:40:10

程序员错误

2020-02-24 23:33:27

前端TypeScriptVue

2017-12-18 12:45:41

前端高薪IT行业

2021-06-27 17:34:57

前端编程语言

2017-05-08 16:17:54

前端开发工具

2019-12-24 08:33:08

前端开发语言

2019-11-01 14:19:02

大数据机器学习工具

2017-06-15 03:14:48

FreeWheel运维

2017-03-31 01:37:01

FreeWheel运维

2020-10-18 06:56:08

编程代码开发
点赞
收藏

51CTO技术栈公众号