Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 浮点数学(关于整数)准确吗?_C#_Floating Accuracy_Floating Point Conversion - Fatal编程技术网

C# 浮点数学(关于整数)准确吗?

C# 浮点数学(关于整数)准确吗?,c#,floating-accuracy,floating-point-conversion,C#,Floating Accuracy,Floating Point Conversion,我有一个修改输入的库(将输入与一个或多个存储变量相加或相乘)。这些变量存储为浮点数。通常,输入也是一个浮点,但在某些情况下它是一个int。我担心它的准确性 float GetValue(float input) { foreach (float modifier in various_data_sources) { if (isFactor) input = input * modifier; else

我有一个修改输入的库(将输入与一个或多个存储变量相加或相乘)。这些变量存储为浮点数。通常,输入也是一个浮点,但在某些情况下它是一个int。我担心它的准确性

float GetValue(float input)
{
    foreach (float modifier in various_data_sources)
    {
        if (isFactor)
            input = input * modifier;
        else
            input = input + modifier;
    }
    return input;
}

void MainLogic()
{
    int defaultValue = 3;
    // If the modifier is 2 (add), I expect the final modified int to be 5:
    DoSomeIntThing((int) GetValue(defaultValue));
}

我能做些什么让这更安全吗?值修改需要是动态的,将修改分离为整数操作和浮点操作将是一个混乱。这是否像我认为的那样不安全,或者像
(int)(2.0f+(float)3)
这样的操作是否总是会产生期望的结果?

除非您的数字是整数,并且没有比float尾数更多的数字,否则对它们的浮点操作是精确的。由于切割末端,浮点数出现错误。虽然没有发生,但也没什么可怕的。但是第一次被2的幂除法会打破这个天堂。或使结果过长的任何操作。

您对
3.5
的输入有何期望?相关的
各种数据源
不能修改为存储
int
,以进行int操作?然后你就可以使用重载了。@MartinSmith我认为你的链接可以很容易地扩展成完整的答案(不,这不安全,因为
int
s大于那些数字)。是的,这就是它变得复杂的地方。JSON浮点是十进制的,所以它实际上可以说是“1.5”,它的意思与您所说的“1.5”相同。保存时,这很容易实现(float.ToString(“f3”)将确保基本正确的舍入)。加载该值时,将其转换为以2为基数的“十进制”值=>精度损失。许多游戏实际上使用整数进行定点十进制数学(例如,Europa Universalis系列使用小数点后3位的整数)。因此,您解析输入(“1”=>1000,“1.5”=>1500),它将保持小数精度高达3位小数。