【问题标题】:Java simple encryption, slightly different output [closed]Java简单加密,输出略有不同[关闭]
【发布时间】:2017-08-24 16:59:05
【问题描述】:

我编写了这个简单的加密程序:

public static void main(String[] args) {
    int password = 123456789;
    int firstLayer = password / 58;
    int secondLayer = firstLayer * 23;
    int thirdLayer = secondLayer + 85;
    System.out.println(thirdLayer);

    int encryptedPassword = thirdLayer;
    int thirdLayerD = encryptedPassword - 85;
    int secondLayerD = thirdLayerD / 23;
    int firstLayerD = secondLayerD * 58;


    System.out.println(firstLayerD);

}

但我有一个奇怪的问题。解密密码后我得到:123456770

我希望得到与原始密码相同的密码,但我不知道问题出在哪里。

【问题讨论】:

  • 如果您了解 Java 中的数据类型,那么您似乎可以通过调试轻松解决这个问题。如果您不了解数据类型,则可能应该阅读教科书。 Stack Overflow 并不是其中任何一个的好替代品。

标签: java integer-division


【解决方案1】:

这是因为 123456789 / 58 = 2128565,32759,这会被截断为 int。

【讨论】:

  • 那么对所有变量使用双精度会更好吗?
  • 是的,否则结果会被截断。
  • 我用双精度替换了所有变量,我得到了这个:1.2345678900000001E8
  • 那么就没有办法解决了吗?
【解决方案2】:

整数除法运算会截断任何余数。

使用double,然后调用Math.round()再次生成一个整数:

public static void main(String[] args) {
    int password = 123456789;
    double firstLayer = password / 58d;
    double secondLayer = firstLayer * 23;
    double thirdLayer = secondLayer + 85;
    double encryptedPassword = thirdLayer;

    double thirdLayerD = encryptedPassword - 85;
    double secondLayerD = thirdLayerD / 23;
    int firstLayerD = (int)Math.round(secondLayerD * 58);

    System.out.println(firstLayerD);
}

输出:

123456789

【讨论】:

  • 那九个人怎么了?
  • @Trap 我什至没有注意到这一点。现在又回来了:查看编辑后的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2013-10-27
  • 2015-06-29
  • 2017-12-20
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多