最近,由于一个数字的15位数显示限制,我一直在与Excel搏斗。我一直在寻找一种方法来显示包含在Excel单元中的值的IEEE754格式(因为它们是以这种方式工作的https://learn.microsoft.com/en-us/office/troubleshoot/excel/floating-point-arithmetic-inaccurate-result )。
在这个项目中,我更希望而不是依赖VBA (尽管如果类似memcpy
_-的解决方案是可能的,我可能会受到诱惑)。
关于我当前的实现,请参见下面的答案。如有任何意见或选择,我们将不胜感激。我选择相信,我错过了一个更简单,测试良好的解决方案。
发布于 2020-08-02 17:26:06
下面的顺序允许我使用Excel公式将一个数字转换为它的IEEE 754十六进制表示。除了0之外,我没有尝试处理任何异常。从单元格A1到G1:
0.123456
=INT(LOG(ABS(A1);2))
指数=ABS(A1)/(2^B1)
尾数=(C1-1)*(2^52)
将尾数转换为十进制=DEC2HEX(1023+B1+IF(A1<0;2^11;0);3)
将符号和指数转换为十六进制=CONCATENATE(DEC2HEX(D1/2^32;5);DEC2HEX(MOD(D1;2^32);8))
将十进制转换为十六进制。="0x"&IF(A1=0;0;E1&F1)
我的一些结果是:
=1.35632902954101*2^14
> 0x40D5B3861187E7A7编辑__:对chux评论的后续跟进。
我们可以看到,由于舍入错误,以下值给出了错误的结果:
=255+0,9999999999999
>0x40700000在这种情况下,步骤D1给出的值为负值。如果我使用这些信息来更新我的指数,我的结果似乎是一致的:
=255+0,9999999999999
> 0x406FFFFFFFFFFFFC下面是更新的B1公式:
=IF((ABS(A1)/(2^INT(LOG(ABS(A1);2)))-1)*(2^52)<0;INT(LOG(ABS(A1);2))-1;INT(LOG(ABS(A1);2)))
https://stackoverflow.com/questions/63219066
复制相似问题