java中%和floorMod()的区别

本文详细解析了Java中取余运算符%与取模运算Math.floorMod()的区别,包括它们的计算方法及结果的正负特性,通过代码验证了两者在不同情况下的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中%和floorMod()的区别

今天在阅读《java核心技术》的时候遇到了floormod()方法这个知识点,所以特此分析一下%和floormod的区别:

%是取余运算,floorMod()是取模运算。

————————————————————————————————————

  1. 取余计算方法:(设a,b为整数,c为中间的商值,r为最终结果)
    a%b
    (1)c=a/b //结果向0方向取整
    (2)r=a-c×b
  2. 取模计算方法:(设a,b为整数,c为中间的商值,r为最终结果)
    floorMod(a,b)
    (1)c=a/b //结果向无穷小方向取整
    (2)r=a-c×b

————————————————————————————————————
区别:
取模运算在(1)时是向0方向取整
取模运算在(1)时是向无穷小方向取整
####对向0方向取整和向无穷小方向取整的理解:
例如:
10/-3=-3.333333,那么3.333333向0方向取整就等于-3
10/-3=-3.333333,那么3.333333向无穷小方向取整就等于-4
-10/3=-3.333333,那么3.333333向0方向取整就等于-3
-10/-3=-3.333333,那么3.333333向无穷小方向取整就等于-4
10/3=3.333333,那么3.333333向0方向取整就等于3
10/3=3.333333,那么3.333333向无穷小方向取整就等于3
-10/-3=3.333333,那么3.333333向0方向取整就等于3
-10/-3=3.333333,那么3.333333向无穷小方向取整就等于3

取余的结果正负和被除数相同
取模的结果正负和除数相同

代码验证:

public class YanZheng {
	public static void main(String[] args) {
		System.out.println("%的取余___________");
		System.out.println(10/-3);
		System.out.println(-10/3);
		System.out.println(10/3);
		System.out.println(10/-3);
		System.out.println("floormod()的取模_____________");
		System.out.println(Math.floorMod(10,-3));
		System.out.println(Math.floorMod(-10,3));
		System.out.println(Math.floorMod(10,3));
		System.out.println(Math.floorMod(-10,-3));
	}

}

代码结果:

%的取余___________
-3
-3
3
-3
floormod()的取模_____________
-2
2
1
-1
<think>好的,用户之前提到Java中的"remander",但可能拼写错误,应该是"remainder",也就是余数的意思。我需要先确认用户的意图,是不是想了解Java中如何计算余数。 首先,Java中有两个运算符余数相关:% Math.floorMod()。用户可能在使用%时遇到了负数的问题,因为%在处理负数时结果符号取决于被除数,而Math.floorMod()的结果符号则取决于除数。需要详细解释这两者的区别,并给出例子说明。 接下来,用户可能是刚学Java的新手,或者在实际编程中遇到了余数计算的问题。比如,在处理循环数组、时间计算或者负数情况时,余数的处理方式不同可能导致错误。需要举一些实际应用的例子,比如判断奇偶性、循环索引、时间转换等,帮助用户理解不同方法的适用场景。 另外,可能用户对余数的数学定义不太清楚,需要简要介绍余数的数学概念,以及Java中的实现如何与数学定义对应或不同。特别是当除数是负数时,%的行为可能预期不同,这时候Math.floorMod()可能更合适。 还要注意用户可能的拼写错误,比如"remainder"的正确拼写,避免混淆。同时,需要检查是否有其他可能的解释,比如是否有名为Remander的类或方法,但Java标准库中没有这个名称,所以应该是余数的问题。 最后,总结两者的使用场景,帮助用户根据需求选择合适的余数计算方法,确保他们的代码在不同情况下表现正确。特别是处理负数时,推荐使用Math.floorMod()来避免意外结果。</think>您提到的"remander"可能是拼写错误。如果是指余数运算,在Java中主要通过以下两种方式实现: --- ### 一、取余运算符 `%` (基本运算符) 语法:`被除数 % 除数` 特性: 1. 结果符号**与被除数相同** 2. 当除数为负数时,遵循公式:$a \% b = a - (a / b) \times b$ 3. 对浮点数同样有效 **示例代码**: ```java System.out.println(7 % 3); // 输出1(7 = 3*2 +1) System.out.println(-7 % 3); // 输出-1(符号跟随被除数) System.out.println(7.5 % 2); // 输出1.5 System.out.println(7 % -3); // 输出1(符号仍跟随被除数) ``` --- ### 二、数学方法 `Math.floorMod()` (JDK 1.8+) 语法:`Math.floorMod(被除数, 除数)` 特性: 1. 结果符号**与除数相同** 2. 遵循数学模运算定义:$floorMod(a,b) = a - \lfloor a/b \rfloor \times b$ 3. 更符合数论中的模运算特性 **示例代码**: ```java System.out.println(Math.floorMod(7, 3)); // 1 System.out.println(Math.floorMod(-7, 3)); // 2(符号跟随除数) System.out.println(Math.floorMod(7, -3)); // -2(符号跟随除数) ``` --- ### 三、关键差异对比表 | 场景 | `%` 运算符结果 | `Math.floorMod()`结果 | |--------------------|---------------|----------------------| | 7, 3 | 1 | 1 | | -7, 3 | -1 | 2 | | 7, -3 | 1 | -2 | | -7, -3 | -1 | -1 | --- ### 四、应用场景建议 1. **循环索引计算**: ```java // 使用floorMod处理负数回绕 int index = Math.floorMod(currentPosition - offset, arrayLength); ``` 2. **时间周期计算**: ```java // 计算分钟数对应的时钟周期 int minutes = 125; int hours = Math.floorMod(minutes, 60); // 结果为5 ``` 3. **判断奇偶性**: ```java boolean isEven = (number % 2) == 0; ``` --- 如果您的实际需求与上述内容不符,请提供更多上下文,我将进一步为您解析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值