Java ~ 关于后端向前端传值时数字类型的精度损失问题

一 场景

    超过16位的数字类型在传输至前端时会失真。后端开发者可能会遇到这样一种情况,当向前端传递较长的的数字类型时会出现精度损失,例如1111111111111111111传递到前端后会转为1111111111111111000。发生该情况的根源在于JavaScript的Long类型精度与后端语言不同,当后端传递的数字长度超过16位时,超出长度的数字会丢失并以0填充。该情况在如今的分布式环境中尤为常见,因为我们往往会使用“雪花算法”来生成数据ID。

二 解决方案

    恰恰是因为常见,因此解决方案也并不少有,主流的解决方案如下:

使用字符串类型传递数据(不推荐)

    使用字符串传递数据不会再造成精度丢失,但缺点也很明显。如果在数据库中使用字符串作为数据标志位,会造成大量磁盘碎片产生,这是因为字符串型的数据标志位并非是顺序的,这使得新的数据不断的从旧数据的中间插入,导致数据页的不断移动分裂,长久以往不但会造成大量磁盘空间的浪费,更会大幅降低数据库的读写效率,因此该方案虽然可以解决问题,但我们并不推荐这样做。

使用@JsonSerialize(推荐)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

    @JsonSerialize注解会自主将数字类型转变为字符串进行传输。@JsonSerialize注解带来的好处显而易见,既保留了原数字类型,使得数据库可以顺序的递增数据;也在数据传输时完成了字符串类型的转换,避免了精度的丢失。最关键的是其使用十分简便,成为了解决方案的首选。

你可能感兴趣的:(Java,前端,后端,java)