gpt4 book ai didi

json - 在 Perl 中使用 JSON::XS::encode_json 将 64 位整数更改为 float

转载 作者:行者123 更新时间:2023-12-01 11:41:49 25 4
gpt4 key购买 nike

我的 Perl 版本支持 64 位。我从多个来源接收 JSON 数据,然后对它进行解码、处理,然后重新编码,以便将数据保存在 MySQL 队列中,供不同的服务器进一步处理。

所有数据都包含 64 位整数作为标识符。有时,在某些我不理解的情况下,JSON::XS::encode_json 将 64 位整数更改为浮点值。例如,393074769794314240 将更改为 3.93074769794314e+17

如何防止这种情况发生?

谢谢。

最佳答案

如果在浮点上下文中的某处使用整数,我可以重现该问题。在浮点运算中使用数字就足够了,例如添加另一个 float 。这是一个示例脚本:

use strict;
use JSON::XS qw(encode_json);
use Devel::Peek;

{
my $x = { number => 4_999_999_999_999_999};
Dump $x->{number};
warn encode_json $x; # encodes number as integer
}

{
my $x = { number => 4_999_999_999_999_999};
my $y = $x->{number} + 0.1;
Dump $x->{number};
warn encode_json $x; # encodes number as float
}

在我的 FreeBSD amd64 系统上我得到

SV = IV(0x80180a458) at 0x80180a468
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 4999999999999999
{"number":4999999999999999} at /tmp/json3.pl line 22.
SV = PVNV(0x80184d930) at 0x801813408
REFCNT = 1
FLAGS = (IOK,NOK,pIOK,pNOK)
IV = 4999999999999999
NV = 5e+15
PV = 0
{"number":5e+15} at /tmp/json3.pl line 29.

解决方法是在 encode_json 调用之前使用类似 $x->{number} += 0; 的东西——这会删除 NV 值( float )值),而 JSON::XS 将再次只看到一个 IV(整数值)。

关于json - 在 Perl 中使用 JSON::XS::encode_json 将 64 位整数更改为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19549412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com