Arguing about this is like arguing that 22/7 should equal

(3.14....).
It is traditional in many programming languages to do truncate. That does not make it correct. I have no dought that Java's choice in this was the same as to have a static void main, even though it really doesn't have anything to do with Java, and is only a slight nod towards C and C++. The entrypoint for a Java program could have just as easily been something like the Runnable interface or an abstract public Main, which your program's entrypoint must be a child of.
Forget about all the language stuff, algebra and programming languages, for a minute. If you have a finite number line where each unit is one step and it's defined starting at 0 and ending at 10, and you walk two steps backwards, then you would be at 8. If you walking forward on this number line, since it is the only number line in existence, when you step off of 10 you are teleported back to 0, or accept that position 0 on the line have been glued onto position 10, so that the perimeter of the number line forms a circle. Starting from the natural position of 0, you walk 2 steps backwards, or -2 steps. You would then be at position 8. If you were to walk 15 forward steps, then you would end up at position 5. The only reason we use division to calculate this is because division is recursive cutting. If a doctors want's to subtract a appendix from a patient, they cut it out in surgery. If I cut away two from ten, then it's eight, if I have to do this multiple times arriving back at zero in between cuts, it works the same. You can calculate modulus using factorisation, not division, and you get just as accurate results. This is because on a finite number line you'd have to find yourself at some position on the line because it is the only space you have to measure in. So, putting aside all the Mathematics and Programming syntax and symbols, it's illogical to return a negative number for a finite number line that does not have any negative positions. Likewise it would be equally as silly to say return 8 from a number line ranging between 0 and -10. With 0 and -10, 8 does not exist on that number line and since we can only have position that exist on that number line, 8 should not be returned given the set of constraints provided.
It is a mathematical legalist argument to state that -2 % 10 != 8 and then provide profs that state otherwise. C got it wrong. While it is traditional to copy C's mistakes, it is still wrong. Providing formulas that calculate illogical results for arithmetic modulus does not magically make C right, even it does make you feel betting by providing a seemingly reasonable rationalization for your position. It's very interesting to note that Java has 2 different types of modulus in it's standard library: the % operator and Math.floorMod. Why you would need to implement the same operation twice? Could it be because one is to satisfy a population of programmers accustomed to wrong answers while also know these answers are wrong and therefore necessitate the implementation of the correct operation to accompany the errant one? Java as many other ambitious programming languages were launched with the promises of lessening errors in programs. How can this be any more then whole-cloth when Java goes out of it's way to provide the wrong result to common operations. What is % in Java if it's not arithmetic modulus? It must be some other operation perpetrating a mascaraed.
Interestingly enough, Ada has a feature which would be perfect for this situation:
Ranges. You can define a type that must contain a number bounded by a desecrate continuum. Though, Ada also has an arithmetically correct modulus operator, so using Ranges would not be the only option.
This would not be a problem if the disabled were not hired to write software.