控制jsonencode使用的有效位数



我想在Matlab R2022a中使用jsonencode来编码包含双精度值的结构,例如:

>> s = struct('a', sqrt(2))
s = 
struct with fields:
a: 1.4142
>> jsonencode(s)
ans =
'{"a":1.4142135623730951}'

但我不需要所有的数字,而且我希望JSON文件保持简短,所以我希望输出如下:

'{"a":1.414}'

jsonencode中似乎没有这样的选项,所以我事先尝试删除低有效数字。不幸的是,存在随机舍入错误:

>> s.a = round(s.a*10^3)*10^-3
s = 
struct with fields:
a: 1.4140
>> jsonencode(s)
ans = 
'{"a":1.4140000000000005}'

这些误差并不总是发生,但似乎struct越深,我就越经常出现这些舍入误差。

然后我尝试使用vpa,但它似乎与jsonencode:不兼容

>> s.a = vpa(s.a,4)
s = 
struct with fields:
a: 1.414
>> jsonencode(s)
ans =
'{"a":{}}'

现在我没有选择了。是否可以使用纯Matlab获得一个干净的JSON输出并控制有效数字?

我使用round函数的一个特性改变了我对数字进行舍入的方式,它删除了随机舍入近似(可能是由于除以10的幂(:

>> s.a = round(s.a, 4, 'significant')
s = 
struct with fields:
a: 1.414
>> jsonencode(s)
ans = 
'{"a":1.414}'

最新更新