我如何划分所以我得到一个十进制值?

时间:2009-03-20 04:47:10

标签: java math division modulus

我想知道如何在Java中获得单值的余数和商。

示例:

  

3/2我应该得到1.5的价值。

如果我使用/运算符,我只得到商。如果我使用%运算符,我只得到余数。如何在同一变量中同时获取两者?

10 个答案:

答案 0 :(得分:57)

quotient = 3 / 2;
remainder = 3 % 2;

// now you have them both

答案 1 :(得分:16)

在您的示例中,Java正在执行整数算术,舍入除法的结果。

根据您的问题,您希望执行浮点运算。为此,必须至少将一个术语指定为(或转换为)浮点数:

指定浮点数:

3.0/2
3.0/2.0
3/2.0

转换为浮点数:

int a = 2;
int b = 3;
float q = ((float)a)/b;

double q = ((double)a)/b;

(有关floatdouble)的讨论,请参阅Java Traps: doubleJava Floating-Point Number Intricacies

答案 2 :(得分:8)

检查出来:http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#divideAndRemainder%28java.math.BigDecimal%29

您只需将 int long 变量包装在 BigDecimal 对象中,然后调用 divideAndRemainder 方法就可以了。返回的数组将包含商和余数(按此顺序)。

答案 3 :(得分:7)

不要担心。在你的代码中,只要你提到单独的/和%操作,即使它看起来效率低下。 让JIT编译器担心关于组合这些操作以在单个机器指令中获得商和余数(据我所知,它通常会这样做。)

答案 4 :(得分:1)

如果您将这两个参数初始化为float,您一定会得到实际的分割值。 例如:

float RoomWidth, TileWidth, NumTiles;
RoomWidth = 142;
TileWidth = 8;
NumTiles = RoomWidth/TileWidth;
  

答:17.75

答案 5 :(得分:1)

int a = 3;
int b = 2;
float c = ((float)a)/b

答案 6 :(得分:1)

你可以喜欢,

int a = 3;
int b = 2;
int quotient = a / b;
int remainder = a % b;
  

要获取实数商

System.out.println((double) a / b);
  

要获取整数的商

System.out.println("Quotient: " + quotient);
System.out.println("Remainder: " + remainder);
  

要获取实数的商,以使小数点后一个数字

System.out.println(a / b + "." + a % b * 10 / b);
  

注意:在最后一种方法中,它不会将数字四舍五入到小数点后。

答案 7 :(得分:0)

@ recursive的solusion(接受的答案)100%正确。我只是添加一个示例代码供您参考。

我的情况是显示两位小数的价格。这是后端响应的一部分:"price": 2300, "currencySymbol": "CD", ...

这是我的助手班:

public class CurrencyUtils
{
    private static final String[] suffix = { "", "K", "M" };

    public static String getCompactStringForDisplay(final int amount)
    {
        int suffixIndex;
        if (amount >= 1_000_000) {
            suffixIndex = 2;
        } else if (amount >= 1_000) {
            suffixIndex = 1;
        } else {
            suffixIndex = 0;
        }

        int quotient;
        int remainder;
        if (amount >= 1_000_000) {
            quotient = amount / 1_000_000;
            remainder = amount % 1_000_000;
        } else if (amount >= 1_000) {
            quotient = amount / 1_000;
            remainder = amount % 1_000;
        } else {
            return String.valueOf(amount);
        }

        if (remainder == 0) {
            return String.valueOf(quotient) + suffix[suffixIndex];
        }

        // Keep two most significant digits
        if (remainder >= 10_000) {
            remainder /= 10_000;
        } else if (remainder >= 1_000) {
            remainder /= 1_000;
        } else if (remainder >= 100) {
            remainder /= 10;
        }

        return String.valueOf(quotient) + '.' + String.valueOf(remainder) + suffix[suffixIndex];
    }
}

这是我的测试类(基于Junit 4):

public class CurrencyUtilsTest {

    @Test
    public void getCompactStringForDisplay() throws Exception {
        int[] numbers = {0, 5, 999, 1_000, 5_821, 10_500, 101_800, 2_000_000, 7_800_000, 92_150_000, 123_200_000, 9_999_999};
        String[] expected = {"0", "5", "999", "1K", "5.82K", "10.50K", "101.80K", "2M", "7.80M", "92.15M", "123.20M", "9.99M"};

        for (int i = 0; i < numbers.length; i++) {
            int n = numbers[i];
            String formatted = CurrencyUtils.getCompactStringForDisplay(n);
            System.out.println(n + " => " + formatted);

            assertEquals(expected[i], formatted);
        }
    }

}

答案 8 :(得分:0)

请将您的输入转换为双倍并除以。

答案 9 :(得分:0)

我的意思是很简单。将其设置为双精度。所以说

double answer = 3.0/2.0;
System.out.print(answer);