Random类有一个在给定范围内生成随机int的方法.例如:
Random r = new Random();
int x = r.nextInt(100);
Run Code Online (Sandbox Code Playgroud)
这将产生一个大于等于0且小于100的int数.我想用长数做同样的事.
long y = magicRandomLongGenerator(100);
Run Code Online (Sandbox Code Playgroud)
Random类只有nextLong(),但它不允许设置范围.
我有从Web服务下载的长值列表(例如:1220227200,1220832000,1221436800 ...).我必须把它转换成日期.不幸的是这种方式,例如:
Date d = new Date(1220227200);
Run Code Online (Sandbox Code Playgroud)
返回1970年1月1日.任何人都知道另一种方法正确转换它?
我有3个非常大的有符号整数.
long x = long.MaxValue;
long y = long.MaxValue - 1;
long z = long.MaxValue - 2;
Run Code Online (Sandbox Code Playgroud)
我想计算他们的截断平均值.预期的平均值是long.MaxValue - 1
,即9223372036854775806
.
无法将其计算为:
long avg = (x + y + z) / 3; // 3074457345618258600
Run Code Online (Sandbox Code Playgroud)
注意:我阅读了有关2个数字的平均值的所有问题,但我不知道该技术如何应用于平均3个数字.
使用它会很容易BigInteger
,但我们假设我不能使用它.
BigInteger bx = new BigInteger(x);
BigInteger by = new BigInteger(y);
BigInteger bz = new BigInteger(z);
BigInteger bavg = (bx + by + bz) / 3; // 9223372036854775806
Run Code Online (Sandbox Code Playgroud)
如果我转换为double
,那么,当然,我失去了精度:
double dx = x;
double dy = y;
double …
Run Code Online (Sandbox Code Playgroud) 我想处理两个数字相乘导致溢出的特殊情况.代码看起来像这样:
int a = 20;
long b = 30;
// if a or b are big enough, this result will silently overflow
long c = a * b;
Run Code Online (Sandbox Code Playgroud)
这是一个简化版本.在真正的程序中,a
并b
在运行时在其他地方采购.我想要实现的是这样的:
long c;
if (a * b will overflow) {
c = Long.MAX_VALUE;
} else {
c = a * b;
}
Run Code Online (Sandbox Code Playgroud)
您如何建议我最好编码?
更新:a
而且b
总是在我的场景下非负.
看来,当你在Java中输入一个数字时,编译器会自动将它读作一个整数,这就是为什么当你输入(long)6000000000
(不在整数范围内)时,它会抱怨它6000000000
不是一个整数.要纠正这个问题,我必须指明6000000000L
.我刚刚了解了这个规范.
还有其他数字规格,如short,byte,float,double?这似乎是好事,因为(我假设),如果你可以指定你输入的数字是短的,那么java就不必抛出它 - 这是一个假设,如果我错了,请纠正我.我通常会自己搜索这个问题,但我不知道甚至会调用这种数字规范.
我在Surface Pro 2平板电脑上运行带有Java 7更新45 x64(没有安装32位Java)的Windows 8.1 x64.
当i的类型为long时,下面的代码需要1688ms,当i是int时,代码需要109ms.为什么在具有64位JVM的64位平台上,long(64位类型)比int慢一个数量级?
我唯一的猜测是,CPU需要更长的时间来添加64位整数而不是32位整数,但这似乎不太可能.我怀疑Haswell不使用纹波进位加法器.
我在Eclipse Kepler SR1中运行它,顺便说一句.
public class Main {
private static long i = Integer.MAX_VALUE;
public static void main(String[] args) {
System.out.println("Starting the loop");
long startTime = System.currentTimeMillis();
while(!decrementAndCheck()){
}
long endTime = System.currentTimeMillis();
System.out.println("Finished the loop in " + (endTime - startTime) + "ms");
}
private static boolean decrementAndCheck() {
return --i < 0;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:以下是VS 2013(下面),同一系统编译的等效C++代码的结果. 长:72265ms int:74656ms 这些结果是在调试32位模式下.
在64位发布模式下: 长:875ms long long:906ms int:1047ms
这表明我观察到的结果是JVM优化怪异而不是CPU限制.
#include "stdafx.h"
#include "iostream"
#include …
Run Code Online (Sandbox Code Playgroud) 我如何在C#中将数据从字符串转换为long?
我有数据
String strValue[i] ="1100.25";
Run Code Online (Sandbox Code Playgroud)
现在我想要它
long l1;
Run Code Online (Sandbox Code Playgroud) 这是一个基本问题,但我找不到答案.我已经研究了浮点运算和其他一些主题,但似乎没有任何东西可以解决这个问题.我确定我的术语错了.
基本上,我想要两个数量 - 完成和总数 - 并将它们分成一个百分比(已经完成了多少).数量是long
s.这是设置:
long completed = 25000;
long total = 50000;
System.out.println(completed/total); // Prints 0
Run Code Online (Sandbox Code Playgroud)
我已经尝试将结果重新分配给双 - 它打印0.0
.我哪里错了?
顺便提一下,下一步是将这个结果乘以100,一旦这个小障碍被推翻,我认为应该很容易.
顺便说一句,这里没有作业,只是普通的老字号(今天可能编码过多).
我目前正在使用Java中的数据类型,如果我已正确理解该类型long
接受范围之间的值:-9,223,372,036,854到+9,223,372,036,854,775,807.现在你可以在下面看到我创建了一个名为Long的变量testLong
,虽然当我插入9223372036854775807作为值时,我得到一个错误说明:
"int类型的文字9223372036854775807超出了范围."
我不知道为什么它将long
数据类型称为int
有人有主意吗?
代码如下:
char testChar = 01;
byte testByte = -128;
int testInt = -2147483648;
short testShort = -32768;
long testLong = 9223372036854775807;
float testFoat;
double testDouble = 4.940656458412;
boolean testBool = true;
Run Code Online (Sandbox Code Playgroud) 我在GNU的C++编译器上尝试这个代码,我无法理解它的行为:
#include <stdio.h>;
int main()
{
int num1 = 1000000000;
long num2 = 1000000000;
long long num3;
//num3 = 100000000000;
long long num4 = ~0;
printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
printf("%d %ld %lld %llu", num1, num2, num3, num4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我取消注释注释行时,代码不会编译并给出错误:
错误:对于long类型,整数常量太大
但是,如果代码按原样编译并执行,则会产生远大于10000000000的值.
为什么?