如果整數在浮點上下文中使用,我可以複製該問題。在浮點運算中使用該數字就足夠了,例如,增加另一個浮點數。下面是一個示例腳本:
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值(浮點值),並且JSON :: XS將再次只能看到一個IV(整數值)。
是否可以將標識符編碼爲原始JSON中的字符串?例如'「123」'而不是'123'? – AKHolland
是的,它可能是一個選項。但是,我不理解爲什麼值會從整數變爲浮點數,這讓我感到非常不舒服。 – calvillo