public class ArmstsrongNumberExample  {

        public static long sum = 0;
        //method to check if the number is Armstrong or not
        static boolean isArmstrong(long n)  {
            long temp, digits=0, last=0;

            temp = n;
            // how many digits the number contains:
            while(temp>0) {
                temp = temp/10;

            temp = n;

            long powresult;
            while(temp>0) {
                //determines the last digit from the number
                last = temp % 10;

                powresult = (long) Math.pow(last, digits);

                sum = sum + powresult;
                System.out.println(last +", "+ powresult +", "+ sum);

                // removes the last digit
                temp = temp/10;
            // compares the sum with n
                //returns if sum and n are equal
                return true;

            else return false;

    public static void main(String args[]) {

        long[] arms = new long[] {40028394225L, 42678290603L,
        44708635679L, 49388550606L, 82693916578L,
        94204591914L,  28116440335967L,  4338281769391370L,

        System.out.println(arms[10] + " = armstrong number? " + isArmstrong(arms[10]));

        System.out.println(sum + " = the sum");
This prg above will tell you if the number you are passing is an Armstrong number or not. The encoded array contains armstrong numbers (I searched the net for a list of them.) Problem-1: It gives false for numbers starting from index 9 of the array! So: Output: 35641594208964132 = armstrong number? false 35641594208964134 = the sum Problem-2: The above result was obtained with the run set to JDK-8. If I change it to anything else, e.g. JDK-10 or 11, or JDK-17, I get this result: Output: 35641594208964132 = armstrong number? false 35641594208964130 = the sum I'm shocked by the result, why JVM can't calculate correctly?!... 8-) I rewrote the program to count with BigInteger instead of longs. Then it finally worked fine, there was no mismatch. In the meantime I realized that probably the following line:
powresult = (long) Math.pow(last, digits);
perhaps this line might have caused the problem, because Math.pow() returns double, which can be unpunctual because of the double type, especially if I typecast it. However, if I need to calculate exponentiation, and I need to work with large integers in the long range, and I want to get EXACT RESULTS... should I never use the Math.pow() method? Rather, should I always modify the code to use the BigInteger class?