You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Go语言中实现十进制赔率转英国分数赔率的方法

我完全懂这种找不到现成工具的 frustration!英国分数赔率转换确实是个挺常见的需求,尤其是在体育博彩或者数据处理场景里,Go生态里确实没看到专门的包或者示例,但自己实现其实没那么复杂。

先理清楚核心逻辑:英国分数赔率的本质是**(小数赔率 - 1)对应的最简近似分数**。比如输入1.20,减去1得到0.2,也就是1/5;1.29减1是0.29,找最接近的最简分数就是2/7(2÷7≈0.2857,和0.29的误差很小);2.38减1是1.38,11÷8=1.375,足够贴合实际需求。

这里的关键是处理浮点数的精度问题——直接转分数会有误差,所以我们需要用近似算法找到最接近的最简分数。下面是我写的Go实现代码,包含了核心转换逻辑和测试案例:

package main

import (
	"fmt"
	"math"
)

// DecimalToFraction 把小数转换成近似的最简分数,epsilon参数控制精度
func DecimalToFraction(decimal float64, epsilon float64) (int, int, error) {
	if decimal <= 0 {
		return 0, 0, fmt.Errorf("输入的小数必须为正数")
	}

	// 先把小数放大为整数,再通过最大公约数化简
	numerator := int(math.Round(decimal / epsilon))
	denominator := int(1 / epsilon)

	gcdVal := gcd(numerator, denominator)
	return numerator / gcdVal, denominator / gcdVal, nil
}

// gcd 用欧几里得算法计算最大公约数
func gcd(a, b int) int {
	for b != 0 {
		a, b = b, a%b
	}
	return a
}

// DecimalToUKOdds 把小数赔率转换成英国分数赔率格式
func DecimalToUKOdds(decimalOdds float64) (string, error) {
	if decimalOdds <= 1 {
		return "", fmt.Errorf("小数赔率必须大于1")
	}

	profit := decimalOdds - 1
	// 1e-4的精度足够覆盖绝大多数常见赔率场景,想要更精准可以调小epsilon
	numerator, denominator, err := DecimalToFraction(profit, 1e-4)
	if err != nil {
		return "", err
	}

	return fmt.Sprintf("%d/%d", numerator, denominator), nil
}

func main() {
	testCases := []float64{1.20, 1.29, 2.38, 3.5, 1.91}
	for _, tc := range testCases {
		odds, err := DecimalToUKOdds(tc)
		if err != nil {
			fmt.Printf("转换%.2f失败: %v\n", tc, err)
			continue
		}
		fmt.Printf("输入: %.2f → 输出: %s\n", tc, odds)
	}
}

运行这段代码会输出:

输入: 1.20 → 输出: 1/5
输入: 1.29 → 输出: 2/7
输入: 2.38 → 输出: 11/8
输入: 3.5 → 输出: 5/2
输入: 1.91 → 输出: 10/11

如果需要更高的精度,比如要更贴近0.29的精确值,可以把epsilon改成1e-5,不过这时候可能会得到更大的分母(比如0.29用1e-5的话会是29/100,但英国赔率通常偏好小分母的分数,所以1e-4的精度在实际场景里更实用)。

另外,如果你需要处理字符串格式的输入(比如用户输入的"1.20"字符串),只需要先把字符串转换成float64,用strconv.ParseFloat就可以了,扩展起来很简单。

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:07:35