score_debug.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. )
  7. // 分数计算常量
  8. const (
  9. UnreadMultiplier = 10000.0 // 未读消息数乘数,用于小数部分存储
  10. )
  11. // calculateScore 计算有序集合的分数,同时存储时间戳和未读消息数
  12. // 整数部分:Unix时间戳,小数部分:未读消息数(除以乘数)
  13. func calculateScore(timestamp int64, unreadCount int) float64 {
  14. score := float64(timestamp) + (float64(unreadCount) / UnreadMultiplier)
  15. fmt.Printf("calculateScore: timestamp=%d, unreadCount=%d, score=%f\n", timestamp, unreadCount, score)
  16. return score
  17. }
  18. // parseScore 从分数中解析出时间戳和未读消息数
  19. func parseScore(score float64) (timestamp int64, unreadCount int) {
  20. timestamp = int64(score) // 整数部分是时间戳
  21. decimalPart := score - float64(timestamp)
  22. // 使用四舍五入来处理浮点数精度问题
  23. unreadCount = int(decimalPart*UnreadMultiplier + 0.5)
  24. fmt.Printf("parseScore: score=%f, timestamp=%d, decimalPart=%f, unreadCount=%d\n", score, timestamp, decimalPart, unreadCount)
  25. return
  26. }
  27. func main() {
  28. fmt.Println("=== 分数计算测试 ===")
  29. // 测试用例
  30. timestamp := time.Now().Unix()
  31. fmt.Printf("原始时间戳: %d\n\n", timestamp)
  32. // 测试1: 未读消息数为0
  33. fmt.Println("测试1: 未读消息数为0")
  34. score1 := calculateScore(timestamp, 0)
  35. ts1, unread1 := parseScore(score1)
  36. fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts1, unread1)
  37. // 测试2: 未读消息数为1
  38. fmt.Println("测试2: 未读消息数为1")
  39. score2 := calculateScore(timestamp, 1)
  40. ts2, unread2 := parseScore(score2)
  41. fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts2, unread2)
  42. // 测试3: 未读消息数为5
  43. fmt.Println("测试3: 未读消息数为5")
  44. score3 := calculateScore(timestamp, 5)
  45. ts3, unread3 := parseScore(score3)
  46. fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts3, unread3)
  47. // 测试4: 未读消息数为100
  48. fmt.Println("测试4: 未读消息数为100")
  49. score4 := calculateScore(timestamp, 100)
  50. ts4, unread4 := parseScore(score4)
  51. fmt.Printf("结果: timestamp=%d, unreadCount=%d\n\n", ts4, unread4)
  52. // 测试5: 验证小数部分的精度
  53. fmt.Println("测试5: 小数部分精度验证")
  54. testScore := 1703123456.123
  55. fmt.Printf("测试分数: %f\n", testScore)
  56. ts5, unread5 := parseScore(testScore)
  57. fmt.Printf("解析结果: timestamp=%d, unreadCount=%d\n\n", ts5, unread5)
  58. // 测试6: 字符串转换测试
  59. fmt.Println("测试6: 字符串转换测试")
  60. scoreStr := fmt.Sprintf("%.6f", score2)
  61. fmt.Printf("分数字符串: %s\n", scoreStr)
  62. if parsedScore, err := strconv.ParseFloat(scoreStr, 64); err == nil {
  63. ts6, unread6 := parseScore(parsedScore)
  64. fmt.Printf("字符串解析结果: timestamp=%d, unreadCount=%d\n", ts6, unread6)
  65. }
  66. }