编辑:我编写了与在家工作时相同的代码来重现错误。这是确切的代码!!
我正在尝试将 float 从 C++ 传递到 C#,并且我使用 C++ CLI 作为中介。 我在 C++ cli 中有以下函数
void myclass::getFloats(float% f1, float %f2)
{
float f11=734212.384f;
float f22=467474.26675f;
f1=f11;
f2=f22;
}
当我在函数末尾放置一个断点并停在那里时,我看到了:
- f1 持有:734212.38
- f2 持有:467474.28
由于浮点限制,我认为它没问题。
但是当作用域结束时,我返回到调用此函数的 C# 代码,如下所示:
myclass m = new myclass();
float f1=0, f2=0;
m.getFloats(ref f1, ref f2);
我在 getFloat 函数之后停下来,我看到了。
- f1 持有 734212.4
- f2 持有 467474.281
我不知道为什么会这样,为什么在第一个数字中他将 0.38 舍入到 0.4 而在第二个数字中他没有舍入而只是添加了 0.001?
任何帮助将不胜感激, 提前致谢
最佳答案
您遇到了 32 位浮点精度的限制。我会更改为 double
并查看您的“问题”是否消失。
你的号码是
float f22=467474.26675f;
最近的浮点表示是
48E44249 467474.28125
您看到的调试显示 “467474.28”
和 “467474.281”
都是显示此值的合理方式。
下一个可表示的数字是
48E4424A 467474.3125
您在评论中表达的舍入误差大约为 0.0000001
的想法仅适用于 0.5 到 1.0 之间的值。通常,舍入误差将在 0.0000001 * value
的数量级。
关于c# - 将它们从 CLI 传递到 C# 时 float 发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18335359/