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

时间:2015-04-10 09:19:15

标签: 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.0336。我可以将它乘以10000,但我会失去精度。

我也试过BigDecimal,但是当我将%变量的值更改为100以外的其他值时,它给了我一个ArithmeticException: “Non-terminating decimal expansion; no exact representable decimal result”

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

我的解决方案:

int version:

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解决方案:

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%时,结果才是正确的。

3 个答案:

答案 0 :(得分:3)

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;

所以我将所有内容都转换为double,这样你就不会有隐式转换为int的问题。

答案 1 :(得分:2)

当你有像1/3这样的有理数时,你的问题出现了,这不能用大十字形表示,因为它有无限的表示。

如果你真的需要非常大的精确度,你应该创建一个新的大型课程,在那里你可以存储一个提名者和分母,并用它们计算。代码很复杂。

如果你不需要那就去双打。

答案 2 :(得分:1)

尝试使用floatdouble(首选double,因为精确度)。