gpt4 book ai didi

java - 某些基本 float 单位的四舍五入为偶数(或奇数)倍数

转载 作者:行者123 更新时间:2023-11-30 06:20:04 35 4
gpt4 key购买 nike

如何舍入为某些基本浮点单位的偶数倍(例如 0.0005f)

float example_input = 2.718281828459f;

float unit = 0.0005f;

使得输出的形式为2*n*unit,其中n是自然数,并且输出 尽可能接近 example_input

另外,对于不均匀倍数,这是如何完成的?

编辑:这是我到目前为止所想到的,但它是错误的:

float roundToEvenMultiple(float input, float unit){
float output = input - (input % (2*unit));
return output;
}

float roundToUnevenMultiple(float input, float unit){
float output = input - (input % (3*unit));
return output;
}

编辑2:

这是解决该问题的另一种方法,但不适用于负数,而且效率似乎非常低。

  float roundToEvenMultiple(float input, float unit){

float result = 0;
while (result < input){
result += 2*unit;
}
return result;
}

float roundToUnevenMultiple(float input, float unit){

float result = 0;
while (result < input){
result += 3*unit;
}
return result;
}

编辑3:

对于

example_input = 2.718281828459f;

unit = 0.0005f;

偶数多重舍入过程应输出:2.718不均匀多重舍入过程应输出:2.7185

最佳答案

令 k 为输入 x 中的单元数。那么如果k是奇数,剩下的就小于一个单位,所以k*unit就是结果。如果 k 为偶数,则该数字位于奇数 k-1 的上半部分,因此结果为 (k+1)*unit。

float roundToUnevenMultiple(float x, float unit) {
int k = (int) (x / unit);
if (k % 2 == 0) {
++k; // Upper half
}
return k * unit;
}

偶数的情况已经很简单了。但可以这样做:

float roundToEvenMultiple(float x, float unit) {
int k = (int) (x / unit);
if (k % 2 == 1) {
++k; // Upper half
}
return k * unit;
}

当 k 较大时,单位中的近似误差将会增大。所以这样做会更精确:

float roundToUnevenMultiple(float x, float unit) {
float remainder = x % unit;
float y = x - remainder;
int k = (int) (x / unit);
if (k % 2 == 0) {
y += unit;
}
return y;
}

float roundToEvenMultiple(float x, float unit) {
float remainder = x % unit;
float y = x - remainder;
int k = (int) (x / unit);
if (k % 2 == 1) {
y += unit;
}
return y;
}

使用double肯定是更好、更常见的主要做法。

关于java - 某些基本 float 单位的四舍五入为偶数(或奇数)倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48338654/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com