Java 转换双精度';s到长数组,以保持相对性

Java 转换双精度';s到长数组,以保持相对性,java,algorithm,Java,Algorithm,假设我有一个double的数组:7.5、10.0、30.0 我想转换为long的数组:3,4,12 这是保留数字之间关系的最小整数表示形式 在这种情况下,将每个值乘以2,然后除以5。 是否有一种通用算法来实现这一点?我想一些lcms和gcds可以解决这个问题 其思想是获得所有元素的lcm,然后将所有元素乘以该lcm,并取所有这些新元素的整数gcd。然后,将每个元素除以gcd,然后打印 #include <bits/stdc++.h> using namespace std;

假设我有一个double的数组:
7.5、10.0、30.0
我想转换为long的数组:
3,4,12

这是保留数字之间关系的最小整数表示形式

在这种情况下,将每个值乘以
2
,然后除以
5

是否有一种通用算法来实现这一点?

我想一些lcms和gcds可以解决这个问题

其思想是获得所有元素的lcm,然后将所有元素乘以该lcm,并取所有这些新元素的整数gcd。然后,将每个元素除以gcd,然后打印

#include <bits/stdc++.h>    
using namespace std;

float mod(float a, float b){
    return a - b * floor(a / b);
}

float gcd(float a, float b){
    if(b == 0) return a;
    return gcd(b, mod(a, b));
}

float lcm(float a, float b){
    return (a * b) / gcd(a, b);
}

int intGcd(int a, int b){
    if(b == 0) return a;
    return gcd(b, a % b);
}


int main(){
    float v[3] = {7.5, 10.0, 30.0};

    float lcmAll = 1;
    for(int i = 0; i < 3; i++){
        lcmAll = lcm(lcmAll, v[i]); 
    }

    int gcdAll = (int) round(lcmAll * v[0]);
    for(int i = 0; i < 3; i++){
        v[i] = round(lcmAll * v[i]);
        gcdAll = intGcd(gcdAll, (int) v[i]); 
    }

    for(int i = 0; i < 3; i++){
        cout<<(int) (v[i] / gcdAll)<<" ";
    }
    cout<<endl;

    return 0;
}
#包括
使用名称空间std;
浮动模式(浮动a、浮动b){
返回a-b*楼层(a/b);
}
浮动gcd(浮动a、浮动b){
如果(b==0),则返回a;
返回gcd(b,mod(a,b));
}
浮动lcm(浮动a、浮动b){
报税表(a*b)/gcd(a、b);
}
int intGcd(int a,int b){
如果(b==0),则返回a;
返回gcd(b,a%b);
}
int main(){
float v[3]={7.5,10.0,30.0};
浮动lcmAll=1;
对于(int i=0;i<3;i++){
lcmAll=lcm(lcmAll,v[i]);
}
int gcdAll=(int)轮(lcmAll*v[0]);
对于(int i=0;i<3;i++){
v[i]=圆形(lcmAll*v[i]);
gcdAll=intGcd(gcdAll,(int)v[i]);
}
对于(int i=0;i<3;i++){

coutEuclid的算法会帮你找到一些方法,但浮点错误会导致问题。我认为你的问题没有遵循标准指南,即提出一个最小的、可重复的示例来说明你迄今为止所做的尝试。请参阅hlep一节,询问有关StackOverflow的好问题:没有保证将所有元素与其LCM相乘将得到整数。例如,2.5、3.5和4.5的LCM为157.5。相乘将得到393.75、551.25、708.75。然后你将除以什么?你可以在数组中添加一个后面有很多零的整数,如
10000