我想在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}'