实现

因为在存储浮点数的时候系统内部在转换过程中会造成精度损失,所以比较浮点数的时候不能比较相等(==),有以下两个方案可以做到比较。

有精度损失的实现

当两个浮点数的差值小于一个极限的时候,我们可以认为他们是相等的,C++ 实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main(){
    float a;
    float b;
    float limit;
    cin >> a;
    cin >> b;
    cin >> limit;
    if (fabs(a - b) < limit){
        cout << "=" << endl;
    }else if(a > b){
        cout << ">" << endl;
    }else cout << "<" << endl;
    return 0;
}

高精度的实现

但是鉴于系统的 float 或 double 本身存在精度限制,我们若要高精度比较浮点数的大小,可能考虑将浮点数读入为字符串来高精度对比。实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstdlib>

using namespace std;

bool exchanged = false;

void exchange(string *a, string *b){
    if (a->length() > b->length()){
        string temp;
        temp = *a;
        *a = *b;
        *b = temp;
        exchanged = true;
    }
}

void _cout(char c){
    if (!exchanged){
        cout << c << endl;
    }else if (c == '>'){
        cout << '<' << endl;
    }else cout << '>' << endl;
}

int main(){
    string a,b;
    cin >> a;
    cin >> b;
    exchange(&a, &b);
    if (a[0] == '-' && b[0] != '-') {
        _cout('<');
        exit(0);
    }
    if (a[0] != '-' && b[0] == '-') {
        _cout('>');
        exit(0);
    }
    int begin = 0;
    int len = (int)a.length();
    int end = (int)b.length();
    if (a[0] == '-') begin = 1;
    for (int i = begin; i < len; i++){
        if (a[i] == '.' && b[i] != '.'){
            _cout('<');
            exit(0);
        }
        if (a[i] != '.' && b[i] == '.'){
            _cout('>');
            exit(0);
        }
        if (a[i] == b[i]){
            continue;
        }else if(a[i] > b[i]){
            _cout('>');
            exit(0);
        }else {
            _cout('<');
            exit(0);
        }
    }
    for (int i = len; i < end; i++){
        if (b[i] != '0') {
            _cout('<');
            exit(0);
            
        }
    }
    cout << "=" << endl;
    return 0;
}

测试计划

测试样例 测试数据A 测试数据B 预计结果 测试结果(有损失) 测试结果(无损失)
1 1.0 1.0 = = =
2 1.1 1.0 < < <
3 0.9 1.0 > > >
4 1.123456789 1.123456788 > = >
5 1.123456788 1.123456789 < = <
6 123.45 12.345 > > >
7 12.345 123.45 < < <
8 1.1231241 1.1232213 < < <
9 -1.2 -1.122 > > >


发现存在错别字或者事实错误?请麻烦您点击 这里 汇报。谢谢您!