Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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#_Unity3d - Fatal编程技术网

C# 处理浮点精度

C# 处理浮点精度,c#,unity3d,C#,Unity3d,我正在unity中创建一个游戏,在将速度重置为0时遇到问题 游戏使用多个油门级别:-2-10-12。当设置为油门级别时,对象将加速到设定的速度。这是可行的,但当我将其重置为0时,即使设置为0,速度也会将其自身设置为0.099999 我怎样才能解决这个问题 using UnityEngine; using System.Collections; using System; public class Script_Control : MonoBehaviour { public static fl

我正在unity中创建一个游戏,在将速度重置为0时遇到问题

游戏使用多个油门级别:-2-10-12。当设置为油门级别时,对象将加速到设定的速度。这是可行的,但当我将其重置为0时,即使设置为0,速度也会将其自身设置为0.099999

我怎样才能解决这个问题

using UnityEngine;
using System.Collections;
using System;

public class Script_Control : MonoBehaviour {
public static float speedLvL;
public static float speed;
public static float health;
public static float manoverablity;
public static float tarSpeed;
public static float curSpeed;           
// Use this for initialization
void Start () {

//setting per ship stats
speedLvL = 0F;
speed = .25F;
health = 25F;
manoverablity = .25F;
//General Stats
tarSpeed = 0F;
curSpeed = 0F;

}

// FixedUpdate is called once per Time
void FixedUpdate () {
    Debug.Log(curSpeed);
//setting speed 
if (speedLvL == 0F){
    tarSpeed = 0.00000F;
}
if (speedLvL == 1F)  {
    tarSpeed = speed/2F;
}
if (speedLvL == 2F)  {
    tarSpeed = speed;
}
if (speedLvL == -1F)  {
    tarSpeed = -speed/5F;
}
if (speedLvL == -2F)  {
    tarSpeed = -speed/2.5F;
}

if (curSpeed < tarSpeed){
    curSpeed += .1F;
}
if (curSpeed > tarSpeed){
    curSpeed -= .1F;
}
    transform.Translate(curSpeed, 0, 0);

}
void Update(){

    if (Input.GetAxis("Throttle") > 0 && speedLvL <= 1 &&  speedLvL >= -2){
        speedLvL = speedLvL+1;      
        DateTime t = DateTime.Now; 
        DateTime tf = DateTime.Now.AddSeconds(.25);
        while (t < tf)
        {
            t = DateTime.Now;
        } 
    }   

    if (Input.GetAxis("Throttle") < 0 && speedLvL <= 2 &&  speedLvL >= -1){
        speedLvL = speedLvL-1;
        DateTime t = DateTime.Now; 
        DateTime tf = DateTime.Now.AddSeconds(.25);
        while (t < tf)
        {
            t = DateTime.Now;
        }
    }

    if (Input.GetAxis("Stearing") < 0){
        transform.Rotate(Vector3.forward* Time.deltaTime, manoverablity );

    }
    if (Input.GetAxis("Stearing") > 0){
        transform.Rotate(Vector3.forward* Time.deltaTime, -manoverablity);

    }
}



}

`

无法对浮点值float或double执行精确比较,因为它们对所表示的值的精度有固有的限制

当需要比较浮点值时,必须始终在要比较的目标值周围使用高于或低于的范围-这样可以解释浮点存储的不精确性


阅读此问题/答案了解更多详细信息:

在FixedUpdate函数中,设置if语句,将速度重置为0

if (speedLvL == 0F){
    tarSpeed = 0.00000F;
}
但是,在相同的功能中,您有以下功能来加速或减速船舶

if (curSpeed < tarSpeed){
    curSpeed += .1F;
}
在我看来,当你将飞船重置为0时,它会在停止调整之前加上.1F

您可能需要将该函数拆分为两个单独的部分


希望这有帮助

事实上,不需要你的答案,你提供的链接就足够了。@I4V是的,我在搜索它时已经兴奋地打了出来。谢谢你,我太沉浸在浮动的不精确中了,我不认为它会有什么问题