2014-05-27 5 views
0

Я пытался экспериментировать с Java немного, и эта проблема пришла:Java Math.pow ((1/(1 + 1), 1) не правильно оценивать

public class TestRandom { 
    public static void main(String[] args){ 
     System.out.println(Math.pow((1/(1+1)),1)); 
    } 
} 

оценивается в 0.0, который был скорее всего, первоначально NaN.

есть ли что-то не так со мной или есть реальное объяснение?

+5

Целочисленное подразделение, и почему вы поднимаете '0,5' до первого в любом случае? Просто напишите '0,5'. –

+0

Эллиот, это большое упрощение реальной вещи. – user3466712

ответ

11

у вас есть целое подразделение там. 1/2 является 0, не 0.5.

Вы можете попробовать изменить выражение на Math.pow((1.0/(1+1)),1), чтобы заставить это быть делением с плавающей запятой.

Редактировать

Отдел в Java был разработан таким же образом, как это было в C и C++, который был до Java. Когда вы делаете деление с двумя выражениями типа int, вы получаете результат типа int. Это был выбор, который разработчики языка сделали, к лучшему или худшему, и мы застряли с ним сейчас. Но в основном это означает, что любой дробный результат от деления округляется вниз (строго говоря, к нулю). В этом случае 1/2 округляется до 0.

Такая же вещь бывает long.

Java Language Specification говорит

целочисленного деление раунды в стороне 0. То есть, фактор производится для операндов н и я, которые являются целыми числами после двоичного числового продвижения (§5.6.2) представляет собой целое значение д, величина которого насколько это возможно, удовлетворяя | d · q | ≤ | n |. Более того, q положительно, когда | n | ≥ | d | и n и d имеют один и тот же знак, но q отрицателен при | n | ≥ | d | и n и d имеют противоположные знаки.

Существует один частный случай, который не удовлетворяет этому правилу: если дивиденд является отрицательным целым наибольшей возможной величиной для своего типа, а делитель равен -1, то происходит целочисленное переполнение и результат равен дивиденду , Несмотря на переполнение, в этом случае не исключение. С другой стороны, если значение делителя в целочисленном делении равно 0, то генерируется исключение ArithmeticException.

+2

+1 Слишком быстро .... phew –

+3

Это включало время, которое потребовалось мне, чтобы решить капчу. –

+0

О, вау, большое спасибо. – user3466712

Смежные вопросы