圆形浮动到更近(或最近的一个)
Round float to closer (or closest one)
我有一些 "reference" 浮点数(例如 1.5、3 和 7.1),有什么方法可以得到其他一些 "random" 浮点数从括号四舍五入到最接近的? (我是说如果有round之类的东西,可以取参考值进行四舍五入)
或者有什么方法可以让一些数字从 2 舍入到更接近的 1(当然除了手动决定)?
我在 Math 中没有找到任何方法,也许是一些外部库?
或者更好的主意是为此编写自己的方法(从括号中获取每个值的绝对差异并获得最小值)?
我知道这很平庸,但它可能很有用..
感谢您的回复
编辑-
例如。:
如果我想
- "round"1个,得1.5
- 第 5 轮,获得 3
- 第 8 轮,获得 7.7
- 第1.7轮,获得1.5
等
这应该大致符合您的要求:
private static double round(double toRound, double[] numbers) {
double diff = Math.abs(numbers[0]-toRound);
double ret = numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (Math.abs(numbers[i] - toRound) < diff) {
diff = Math.abs(numbers[i] - toRound);
ret = numbers[i];
}
}
return ret;
}
但请注意,当可舍入数的差值相同时,return会return数组中最先出现的数!
更优化的答案:
"for i"方式,更易读
private static double roundForI(double toRound, double[] numbers) {
int minIndex = 0;
double minDiff = Double.MAX_VALUE;
double diff;
for (int i=0; i<numbers.length; ++i) {
diff = Math.abs(numbers[i]-toRound);
if (diff < minDiff) {
minDiff = diff;
minIndex = i;
}
}
return numbers[minIndex];
}
更短的一个,"For each"方式
private static double roundForEach(double toRound, double[] numbers) {
double diff, roundValue = 0, minDiff = Double.MAX_VALUE;
for (double dob : numbers) {
if ((diff = Math.abs(dob-toRound)) < minDiff) {
minDiff = diff;
roundValue = dob;
}
}
return roundValue;
}
和"Java8 Golf Style"方式,这并不比上面的两种方式更好。
private static double roundLambda(double n, double[] a) {
double[] r = {0}, d = {Double.MAX_VALUE};
Arrays.stream(a).filter((i)->Math.abs(i-n)<d[0]).forEach(i->{d[0]=Math.abs(i-n);r[0]=i;});
return r[0];
}
我有一些 "reference" 浮点数(例如 1.5、3 和 7.1),有什么方法可以得到其他一些 "random" 浮点数从括号四舍五入到最接近的? (我是说如果有round之类的东西,可以取参考值进行四舍五入)
或者有什么方法可以让一些数字从 2 舍入到更接近的 1(当然除了手动决定)?
我在 Math 中没有找到任何方法,也许是一些外部库? 或者更好的主意是为此编写自己的方法(从括号中获取每个值的绝对差异并获得最小值)? 我知道这很平庸,但它可能很有用..
感谢您的回复
编辑- 例如。: 如果我想
- "round"1个,得1.5
- 第 5 轮,获得 3
- 第 8 轮,获得 7.7
- 第1.7轮,获得1.5
等
这应该大致符合您的要求:
private static double round(double toRound, double[] numbers) {
double diff = Math.abs(numbers[0]-toRound);
double ret = numbers[0];
for (int i = 1; i < numbers.length; i++) {
if (Math.abs(numbers[i] - toRound) < diff) {
diff = Math.abs(numbers[i] - toRound);
ret = numbers[i];
}
}
return ret;
}
但请注意,当可舍入数的差值相同时,return会return数组中最先出现的数!
更优化的答案:
"for i"方式,更易读
private static double roundForI(double toRound, double[] numbers) {
int minIndex = 0;
double minDiff = Double.MAX_VALUE;
double diff;
for (int i=0; i<numbers.length; ++i) {
diff = Math.abs(numbers[i]-toRound);
if (diff < minDiff) {
minDiff = diff;
minIndex = i;
}
}
return numbers[minIndex];
}
更短的一个,"For each"方式
private static double roundForEach(double toRound, double[] numbers) {
double diff, roundValue = 0, minDiff = Double.MAX_VALUE;
for (double dob : numbers) {
if ((diff = Math.abs(dob-toRound)) < minDiff) {
minDiff = diff;
roundValue = dob;
}
}
return roundValue;
}
和"Java8 Golf Style"方式,这并不比上面的两种方式更好。
private static double roundLambda(double n, double[] a) {
double[] r = {0}, d = {Double.MAX_VALUE};
Arrays.stream(a).filter((i)->Math.abs(i-n)<d[0]).forEach(i->{d[0]=Math.abs(i-n);r[0]=i;});
return r[0];
}