| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- package main
- import (
- "fmt"
- "strconv"
- "time"
- )
- // 分数计算常量
- const (
- UnreadMultiplier = 10000.0 // 未读消息数乘数,用于小数部分存储
- )
- // calculateScore 计算有序集合的分数,同时存储时间戳和未读消息数
- // 整数部分:Unix时间戳,小数部分:未读消息数(除以乘数)
- func calculateScore(timestamp int64, unreadCount int) float64 {
- score := float64(timestamp) + (float64(unreadCount) / UnreadMultiplier)
- fmt.Printf("calculateScore: timestamp=%d, unreadCount=%d, score=%f\n", timestamp, unreadCount, score)
- return score
- }
- // parseScore 从分数中解析出时间戳和未读消息数
- func parseScore(score float64) (timestamp int64, unreadCount int) {
- timestamp = int64(score) // 整数部分是时间戳
- decimalPart := score - float64(timestamp)
- // 使用四舍五入来处理浮点数精度问题
- unreadCount = int(decimalPart*UnreadMultiplier + 0.5)
- fmt.Printf("parseScore: score=%f, timestamp=%d, decimalPart=%f, unreadCount=%d\n", score, timestamp, decimalPart, unreadCount)
- return
- }
- func main() {
- fmt.Println("=== 分数计算测试 ===")
- // 测试用例
- timestamp := time.Now().Unix()
- fmt.Printf("原始时间戳: %d\n\n", timestamp)
- // 测试1: 未读消息数为0
- fmt.Println("测试1: 未读消息数为0")
- score1 := calculateScore(timestamp, 0)
- ts1, unread1 := parseScore(score1)
- fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts1, unread1)
- // 测试2: 未读消息数为1
- fmt.Println("测试2: 未读消息数为1")
- score2 := calculateScore(timestamp, 1)
- ts2, unread2 := parseScore(score2)
- fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts2, unread2)
- // 测试3: 未读消息数为5
- fmt.Println("测试3: 未读消息数为5")
- score3 := calculateScore(timestamp, 5)
- ts3, unread3 := parseScore(score3)
- fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts3, unread3)
- // 测试4: 未读消息数为100
- fmt.Println("测试4: 未读消息数为100")
- score4 := calculateScore(timestamp, 100)
- ts4, unread4 := parseScore(score4)
- fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts4, unread4)
- // 测试5: 验证小数部分的精度
- fmt.Println("测试5: 小数部分精度验证")
- testScore := 1703123456.123
- fmt.Printf("测试分数: %f\n", testScore)
- ts5, unread5 := parseScore(testScore)
- fmt.Printf("解析结果: timestamp=%d, unreadCount=%d\n\n", ts5, unread5)
- // 测试6: 字符串转换测试
- fmt.Println("测试6: 字符串转换测试")
- scoreStr := fmt.Sprintf("%.6f", score2)
- fmt.Printf("分数字符串: %s\n", scoreStr)
- if parsedScore, err := strconv.ParseFloat(scoreStr, 64); err == nil {
- ts6, unread6 := parseScore(parsedScore)
- fmt.Printf("字符串解析结果: timestamp=%d, unreadCount=%d\n", ts6, unread6)
- }
- }
|