Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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/4/c/63.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
Java 计算时,我的数字要使用什么类型_Java - Fatal编程技术网

Java 计算时,我的数字要使用什么类型

Java 计算时,我的数字要使用什么类型,java,Java,所以我需要计算一个值 我得到的输入是: a is seed/m2. The value might a for example 56 but it might be 56.7 also. b is in g's. for instance 600g c is % value, might be 90.6 also d is % value, might be 90.6 also 我得到的结果应该是kg/ha 常规int不能解决这个问题。(56*600/100/100)/100的值 将为0.0

所以我需要计算一个值

我得到的输入是:

a is seed/m2.  The value might a for example 56 but it might be 56.7 also.
b is in g's. for instance 600g
c is % value, might be 90.6 also
d is % value, might be 90.6 also
我得到的结果应该是
kg/ha
常规int不能解决这个问题。
(56*600/100/100)/100的值
将为
0.0336
。我可以把它乘以10000,但我会失去精度

我也为此尝试了BigDecimal,但它给了我一个
算术异常:“非终止十进制扩展;没有精确的可表示的十进制结果”
,当我将%变量的值更改为100以外的值时

什么是最好的选择?在exel中进行计算很容易,因为它知道如何自动转换每个值,但在Java代码中进行计算是另一回事

我的解决方案:

int版本:

int a = Integer.decode(germinativeSeed.getText().toString());
            int b = Integer.decode(seedMass.getText().toString());
            int c = Integer.decode(clean.getText().toString());
            int d = Integer.decode(germinative.getText().toString());

            int result2 = ( a * b / c / d) / 100;
结果是0

大十进制解:

BigDecimal result2;

            BigDecimal a = new BigDecimal(germinativeSeed.getText().toString());
            BigDecimal b = new BigDecimal(seedMass.getText().toString());

            BigDecimal c;
            BigDecimal d;

            if (clean.getText().toString().equals("")) {
                c = new BigDecimal("100");
            } else {
                c = new BigDecimal(clean.getText().toString());
            }

            if (germinative.getText().toString().equals("")) {
                d = new BigDecimal("100");
            } else {
                d = new BigDecimal(germinative.getText().toString());
            }

            BigDecimal hundred = new BigDecimal("100");
            BigDecimal test = new BigDecimal("10000");

            result2 = a.multiply(b);
            result2 = result2.divide(c, 2, RoundingMode.HALF_UP);
            result2 = result2.divide(d, 2, RoundingMode.HALF_UP);
            result2 = result2.divide(hundred, 2, RoundingMode.HALF_UP);
            result2 = result2.multiply(test);

只有当%值为100%时,此结果才正确。

尝试使用
浮点值
双精度
(由于精度原因,首选
双精度


所以我把所有东西都转换成了double,这样在隐式转换成int时就不会有问题了。

当你有像1/3这样的有理数时,问题就来了,它不能用bigdecimal来表示,因为它有无限的表示

如果你真的需要非常高的精度,你应该创建一个新的bigrational类,在那里你将存储一个命名符和分母,并用它们进行计算。代码将非常复杂


如果您不需要,请选择双倍。

添加了我当前的解决方案。为什么
Integer.decode
?我建议您在从字符串中读取值后调试或记录变量,以确保读取的值正确。我有一个字符串,必须将其转换为int。如果您的字符串真的是int,
Integer。解码
不是办法,
Integer。parseInt
是一个不太复杂的选择。请尝试一下。将让您知道结果。这似乎有效!将在计时器结束时接受您的答案。
double seed = (double) seedInput;
double m2 = (double) m2Input;
double b = (double) bInput; // unit 'g' is not relevant
double c = (double) cInput;
double d = (double) dInput;
double a = seed / m2;
int result2 = ( a * b / c / d) / 100.0;