The formula for calculating scores depends on the use case and recipe. Based on the documentation for the user-personalization recipe:
Models that are based on USER_PERSONALIZATION recipes score all of the items in your Items dataset relative to each other on a scale from 0 to 1 (both inclusive), so that the total of all scores equals 1. For example, if you're getting movie recommendations for a user and there are three movies in the Items dataset, their scores might be 0.6, 0.3, and 0.1. Similarly, if you have 1,000 movies in your inventory, the highest-scoring movies might have very small scores (the average score would be .001), but, because scoring is relative, the recommendations are still valid.
Since the score values you shared have low absolute values, I suspect that you're using user-personalization. The higher number of distinct items in your interactions dataset, the smaller the score values will be. Look at the scores relative to other items in the response rather than reading too much into their absolute values.
However, the scoring formula for the personalized-ranking is different.
Like the scores returned by the GetRecommendations operation, GetPersonalizedRanking scores sum to 1, but because the list of considered items is much smaller than your full Items dataset, recommendation scores tend to be higher.
Mathematically, the scoring function for GetPersonalizedRanking is identical to GetRecommendations, except that it only considers the input items. This means that scores closer to 1 become more likely, as there are fewer other choices to divide up the score