【问题标题】:An unusual floating point rounding error in Unity/C#?Unity/C# 中出现不寻常的浮点舍入错误?
【发布时间】:2018-06-24 00:36:49
【问题描述】:

我正在使用 Unity Asset Store 中的一项名为 World Map Strategy Kit 的资源来开发棋盘游戏。该工具包使用 Vector2 的列表,其值从 -0.5 到 +0.5 来确定我地图上省份/国家的边界​​。

我正在努力读取 SVG 路径并将它们转换为 WMSK 输入的点列表。

基本上,没有给你我的整个 40 行解析方法,我有如下设置:

string raw = "1213.6788";
float x = float.Parse(raw);
float y = float.Parse(raw);
Vector2 a = new Vector2 (x, y);
Debug.Log(a);

它始终将结果四舍五入为 1213.7。

一开始我以为这可能只是 float 的 Parse 方法的一个怪癖,所以我写了一个如下所示的改编版本:

string raw = "1213.6788";
float x = (float)double.Parse(raw);
float y = (float)double.Parse(raw);
Vector2 a = new Vector2 (x, y);
Debug.Log(a);

同样的事情。它四舍五入到最接近的十分之一。

我注意到以下类似的事情:

string rawX = "1213.6788";
string rawY = "891.7";
float x = (float)double.Parse(raw);
float y = (float)double.Parse(raw);
Vector2 a = new Vector2 (x, y);
int tw = 2500;
int th = 1250;
Vector2 translated = new Vector2 ();
translated.x = (a.x - tw * 0.5f + 0.5f) / tw;
translated.x = (a.y - th * 0.5f + 0.5f) / th;
Debug.Log(a);

现在的输出是: (0.0, 0.2)

再次将其四舍五入到最接近的十分之一。我可以接受相当程度的不准确,但这根本无法接受——我试图将坐标从 2500×1250 坐标系转换为 1×1 坐标系,范围从 -0.5 到 +0.5。我希望大多数坐标需要 3-5 个小数点的信息才能正确存储。

在我使用过的任何编程语言中——即使是 Java——也没有定期将浮点数四舍五入到最接近的十分之一。根据我的经验,这不是他们通常会做的事情。

所以问题是:我做错了什么?我的意思是,当然可以将信息解析为浮点数而不会丢失几乎所有的小数位信息?

它会不会是我的电脑(我有一台相对较弱且过时的笔记本电脑,2010 年的 1 GHz Intel CPU 和 2 GB RAM - 是的,我知道我需要升级)?

还是 Unity 特有的?会不会是 Vector2 数据结构造成的损失?

【问题讨论】:

    标签: unity3d precision parsefloat


    【解决方案1】:

    Unity 的默认 VectorX.ToString()(在转换为文本以显示在您的 Debug.Log() 调用中时使用)使用十分之一作为其最大精度。

    要获得更高的精度,只需使用自定义格式调用.ToString():例如,要以千位精度显示,请使用Debug.Log(yourVectorX.ToString("F4"));

    注意:基础价值应该是正确的;它只是在文本中显示为圆角

    【讨论】:

    • 这似乎是一个愚蠢的问题,但我没有广泛使用自定义格式的 ToString (方法参数显然需要一个字符串),所以你能不能给我一个例子四舍五入到小数点后 5 位?
    • @the_OTHER_DJMethaneMan 在您输入问题时已经在使用 4 位小数示例进行编辑。应该足以让您弄清楚 5 位十进制格式 =P... 对于其他格式的格式;好吧,这是一个不同的问题,在 SO 上已经针对string.Format 提出了更合适的问题,而且格式样式很多;以及谷歌。
    • 是的,我已经熟悉 string.Format ——我在我用过的每种语言中都使用了它的变体,包括 C# ;-) 感谢您的回答,抱歉不便。
    猜你喜欢
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多