c# - 将它们从 CLI 传递到 C# 时 float 发生变化

标签 c# c++ floating-point c++-cli

编辑:我编写了与在家工作时相同的代码来重现错误。这是确切的代码!!

我正在尝试将 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/

相关文章:

c# - C# 中的 XElement 值

c# - 如何从工具提示中查找控件

c++ - 如何在 C++ 中的字符串中显示摄氏度

floating-point - 在 Julia 的 [-1, 1] 中获取随机浮点值

c++ - std::numeric_limits::digits10<float> 和点后的精度

c# - 将 IQueryable<> 类型对象转换为 List<T> 类型?

c# - 使用 BouncyCaSTLe 进行 OpenPGP 加密

c++ - 为什么这行得通? (多重继承,切片)

C++11 - 将非静态数据成员声明为 'auto'

c - 为什么我的平均值不是正确答案? (求均值的C代码程序)